C feof()在实际结束前一行检测文件结束
我有一个函数,可以读取文件并检测文件何时结束 函数当前只读取最后一行的第二行并结束。谁能告诉我我做错了什么,因为我自己都看不出来:C feof()在实际结束前一行检测文件结束,c,scanf,feof,C,Scanf,Feof,我有一个函数,可以读取文件并检测文件何时结束 函数当前只读取最后一行的第二行并结束。谁能告诉我我做错了什么,因为我自己都看不出来: int readIn(TinCan* inCan, int toggle) { int ii, isFinished = 0; char fullName[20]; sprintf(fullName, "Label_%d.txt", inCan->pid); FILE* fp; fp = fopen(fullName, "r")
int readIn(TinCan* inCan, int toggle)
{
int ii, isFinished = 0;
char fullName[20];
sprintf(fullName, "Label_%d.txt", inCan->pid);
FILE* fp;
fp = fopen(fullName, "r");
if(fp==NULL)
{
printf("Error: could not open %s\n", fullName);
}
else
{
for (ii=0; ii < ((inCan->ac)-1); ii++)
{
fscanf(fp, "%*d %*d %*d\n"); /*move through lines without scanning*/
}
fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time);
}
if (feof(fp) && (toggle == 1))
{
printf("File ended");
writeLog(inCan);
isFinished = 1;
terminated++;
}
fclose(fp);
return finished;
}
int readIn(TinCan*印加,int切换)
{
int ii,isFinished=0;
字符全名[20];
sprintf(全名,“Label_u%d.txt”,印加->pid);
文件*fp;
fp=fopen(全名,“r”);
如果(fp==NULL)
{
printf(“错误:无法打开%s\n”,全名);
}
其他的
{
对于(ii=0;ii<((印加->交流)-1);ii++)
{
fscanf(fp,“%*d%*d%*d\n”);/*在不扫描的情况下通过行移动*/
}
fscanf(fp,“%d%d%d”,&inca->ac,&inca->state,&inca->time);
}
if(feof(fp)&(toggle==1))
{
printf(“文件结束”);
writeLog(印加);
isFinished=1;
终止++;
}
fclose(fp);
返回完成;
}
我希望您的程序中有一个类似以下内容的循环:
while (!feof(fp)) {
...
fscanf(fp, "%*d %*d %*d\n");
...
}
如果您想检测文件何时结束。我希望您的程序中有一个类似以下内容的循环:
while (!feof(fp)) {
...
fscanf(fp, "%*d %*d %*d\n");
...
}
如果要检测文件何时结束。您希望它如何检测文件是否结束?您根据
inca->ac-1
执行一系列有限的fscanf调用,然后再执行一次,然后调用feof。如何找到文件的结尾?它会告诉你是否到了最后,但它在eof之前不会读取数据,是吗?也许我遗漏了什么。为什么不给我们一个复制这个文件的最小的输入文件,以及你从这个程序中得到的输出与你期望的相比呢?最后一行有'\n'
?所以最后一行应该是空行。否则fscanf(“…\n”)
不会将值适当地放入变量中。请不要重复发布。您希望它如何检测文件是否已结束?您根据inca->ac-1
执行一系列有限的fscanf调用,然后再执行一次,然后调用feof。如何找到文件的结尾?它会告诉你是否到了最后,但它在eof之前不会读取数据,是吗?也许我遗漏了什么。为什么不给我们一个复制这个文件的最小的输入文件,以及你从这个程序中得到的输出与你期望的相比呢?最后一行有'\n'
?所以最后一行应该是空行。否则fscanf(“…\n”)
将不会将值适当地放入变量中。请不要重复发布。这将在文件结束前进行扫描,但我希望按照ac值指定的时间一次读取一行,然后在该行读取为最后一行时采取措施。那么,您如何知道这一行太早了?ac是我要读取的行,所以我跳过AC-1,然后读正确的一行。这很好,但是你怎么知道它测试eof==真的太早了一行?定义从不读?很明显,它已经读过了,否则你就得不到EOF了,所以它不知怎么地丢失了。您还应该打印出所有fscanf调用的返回值并打印出来。这样可以一直扫描到文件末尾,但我希望按照ac值指定的时间一次读取一行,然后在该行读取为最后一行时采取措施。那么,您如何知道这一行太早了?ac是我要读取的行,所以我跳过AC-1,然后读正确的一行。这很好,但是你怎么知道它测试eof==真的太早了一行?定义从不读?很明显,它已经读过了,否则你就得不到EOF了,所以它不知怎么地丢失了。您还应该打印出所有fscanf调用的返回值并打印出来。