请各位帮忙看看!!老是出问题!!

oicqliuyong 2006-12-01 04:12:54
下面这段程序,我觉得是正确的,但是运行的结果在我意料之外
先请看程序:
#include <stdio.h>
void print (void);
struct by
{
char keep[15];
};
struct by save[999];
void print (void)
{
FILE *inputfirst;
int i=0,y=0;
char temp;
char temp1[10];
printf ("请输入您要比较的文件名(如:test.txt):");
scanf ("%10s",temp1);
inputfirst = fopen (temp1,"r");
if (inputfirst == NULL)
{
printf ("没找到您输入的文件名,请重新输入!\n");
exit(1);
}
do
{
do
{
temp = getc (inputfirst);
save[i].keep[y] = temp;
++y;
}while (temp != '\n');
save[i].keep[y -1] = '\0';
++i;
}while (temp != EOF);
printf ("%s\n",save[0].keep); \\打印测试一下
}
int main (void)
{
print();
return 0;
}
这段是我想把一个文本文件里面的数据读取到结构中去。
因为我文本中的结构是这样的
1.4.G.G01.00341
1.4.G.G01.00351
1.4.G.G01.00343
1.4.G.G01.00345
1.4.G.G01.00349
1.4.G.G01.00353
1.4.G.G01.00352
1.4.G.G01.00335
1.4.G.G01.00347
1.4.G.G01.00336
1.4.G.G01.00003
1.4.G.G01.00023
所以,当遇到'\n'符号的时候就把前面读到的,存到一个结构成员中去。
用EOF做文件结尾的判断。
但是奇怪的是,如果我拿走
do
{
}while (temp != EOF);
这个外层循环的话,那就能读出一排来,但是加上这个就变成死循环了,而且,结构里面也没能存到字符。
请各位帮我看看,到底问题是出在哪里呢?谢谢,小弟感激不尽。
我整个程序如下:
#include <stdio.h>
#include <stdbool.h>
bool compare (char a[] , char b[]);
void find (void);
void fuzhi (char a[] , char b[]);
struct by
{
char keep[15];
};
struct by save[999];
struct shu
{
char repeat[15];
int number;
};
struct shu jieguo[999];
bool compare (char a[] , char b[])
{
int i = 0;
while (a[i] == b[i] && a[i] != '\0' && b[i] != '\0')
{
++i;
}
if (a[i] == '\0' && b[i] == '\0')
{
return true;
}
else
{
return false;
}
}
void find (void)
{
FILE *inputfirst;
int i,y,a,b,e,f = 0,g = 0;
char temp;
char temp1[10];
bool t = false;
printf ("请输入您要比较的文件名(如:test.txt):");
scanf ("%10s",temp1);
inputfirst = fopen (temp1,"r");
if (inputfirst == NULL)
{
printf ("没找到您输入的文件名,请重新输入!\n");
exit(1);
}
for (i = 0;temp != EOF; ++i)
{
for (y = 0;temp != '\n'; ++y)
{
temp = getc(inputfirst);
save[i].keep[y] = temp;
}
save[i].keep[y - 1] = '\0';
}
for (a = 0; a <= i; ++a)
{
b = 0 , e = 0;
while (b <= i)
{
t = compare (save[b].keep,save[a].keep);
if (t == true)
{
++e;
}
}
if (e > 1)
{
jieguo[f].number = e;
fuzhi (jieguo[f].repeat,save[a].keep);
++f;
}
}
if (f == 0)
{
printf ("您的文件中没有重复的内容!\n");
}
else
{
for (a = 0; a < f; ++a)
{
printf ("%s%80i",jieguo[a].repeat,jieguo[a].number);
}
}
}
void fuzhi (char a[] , char b[])
{
int i;
for (i = 0;b[i] != '\0'; ++i)
{
a[i] = b[i];
}
a[i] = '\0';
}
int main (void)
{
find();
return 0;
}
...全文
386 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
oicqliuyong 2006-12-02
  • 打赏
  • 举报
回复
xiaohao824()
谢谢,谢谢。
太感谢了。天啊~~~~~~`我怎么没想到Y要重新等于0啊。如果不等于,那字符数组的长度就超出了。哎……
天啊~~~~~~~居然犯这种逻辑错误,还检查不出来,真是该打PP。

给分,给分!!!!!!!
lockhall 2006-12-02
  • 打赏
  • 举报
回复
so complex.watering.-_-
oicqliuyong 2006-12-02
  • 打赏
  • 举报
回复
救命啊,我等了一个晚上了,还没人回答我啊。
xiaohao824 2006-12-02
  • 打赏
  • 举报
回复
while (temp != '\n');------>while (temp != '\n' && temp != EOF);
我上面忘记改这个了
xiaohao824 2006-12-02
  • 打赏
  • 举报
回复
do
{
do
{
temp = getc (inputfirst);
save[i].keep[y] = temp;
++y;
}while (temp != '\n');
save[i].keep[y -1] = '\0';
++i;
/////////////////////////////////
y=0;
/////////////////////////////////
}while (temp != EOF);
没太细看,你再试一下
oicqliuyong 2006-12-02
  • 打赏
  • 举报
回复
哎……Help
oicqliuyong 2006-12-01
  • 打赏
  • 举报
回复
很好,谢谢大家。我也知道有其他的方法可以实现。但是我就想知道这两个循环中间到底出什么问题了。

我把循环按照cruzeflute(星幻)所说,改为:
do
{
do
{
temp = getc(inputfirst);
save[i].keep[y] = temp;
++y;
}while (temp != '\n' && temp != EOF);
save[i].keep[y - 1] = '\0';
printf ("%s\n",save[i].keep);
++i;
}while (temp != EOF);
得到的结果是这样的:
1.4.G.G01.00341
1
43
345
0349
00353
……………………(依次类推)
正常的应该是:
1.4.G.G01.00341
1.4.G.G01.00351
1.4.G.G01.00343
1.4.G.G01.00345
1.4.G.G01.00349
1.4.G.G01.00353
1.4.G.G01.00352
1.4.G.G01.00335
现在的结果从第二行起,getc函数怎么会重右边的最后一位读起啊。而且我的思路跟着这循环走,怎么也想不出会是这样的结果,忘高手指点。到底这个循环问题出在哪里啊?
万分感谢。
m00ners 2006-12-01
  • 打赏
  • 举报
回复
飘过~
yingge 2006-12-01
  • 打赏
  • 举报
回复
fgets读到EOF会返回NULL,或者用了fgets之后用feof函数判断
oicqliuyong 2006-12-01
  • 打赏
  • 举报
回复
楼上的各位兄弟都说,用fgets函数来读一行,但是有个问题是。如果它是读一行的话,那怎么对EOF文件尾进行判断呢?
oicqliuyong 2006-12-01
  • 打赏
  • 举报
回复
各位的建议,我参考、参考。我看看,刚才太郁闷睡觉去了。我现在试试,OK了,马上给分。
boot2006 2006-12-01
  • 打赏
  • 举报
回复
不好意思,刚才没仔细看题目
你的test.txt中每一行都已经是15字节了(1.4.G.G01.00341)
所以char keep[15];应该为16用来存放\0

那么就因该
while(!feof(inputfirst))
{
fgets(save[i].keep,16,inputfirst);
save[i].keep[15] = '\0';
i++;
}

这样就行了
cruzeflute 2006-12-01
  • 打赏
  • 举报
回复
前面我想说的是:
把temp != '\n'
换成temp != EOF && temp != '\n'?

不过EOF是负数,temp是一个不可能为负的数,它们的比较在某些没有扩展的机子上可能会永不相等(有本书上这么说的)
boot2006 2006-12-01
  • 打赏
  • 举报
回复

do
{
do
{
temp = getc (inputfirst);
save[i].keep[y] = temp;
++y;
}while (temp != '\n');
save[i].keep[y -1] = '\0';
++i;
}while (temp != EOF);

改成
while(!feof(inputfirst))
{
fgets(save[i].keep,100,inputfirst);
save[i].keep[strlen(save[i].keep) - 1] = '\0';
i++;
}
试试看
cruzeflute 2006-12-01
  • 打赏
  • 举报
回复
把temp != '\n'
换成temp != '\n' && temp != '\n'?
chai2010 2006-12-01
  • 打赏
  • 举报
回复
没有细看,供参考

void print (void)
{
FILE *inputfirst;
int i=0,y=0;
char temp;
char temp1[10];

printf ("请输入您要比较的文件名(如:test.txt):");
scanf ("%10s",temp1);

inputfirst = fopen (temp1,"r");
if (inputfirst == NULL)
{
printf ("没找到您输入的文件名,请重新输入!\n");
exit(1);
}

do
{
// 初始化y,如y = 0;

do
{
// 这里可能读到EOF,但是又没有办法跳出

temp = getc (inputfirst);
save[i].keep[y] = temp;
++y;
}while (temp != '\n');

save[i].keep[y -1] = '\0';
++i;
}while (temp != EOF);

printf ("%s\n",save[0].keep); \\打印测试一下
}
ouyh12345 2006-12-01
  • 打赏
  • 举报
回复
用fgets,一次读一行

循环可以是这样:
char str[20];
while(fgets(str, 20, file) != NULL)
{
//处理str
if(feof(file))
{
break;
}
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧