C 即使找到其中的数据,fread仍返回0
我需要这段代码的帮助,我正在尝试更新我的文件,我的fread返回0,即使我尝试更新的数据在文件中找到C 即使找到其中的数据,fread仍返回0,c,C,我需要这段代码的帮助,我正在尝试更新我的文件,我的fread返回0,即使我尝试更新的数据在文件中找到 void updateFile(char filename[], int num, int update){ int pos, checker, y; FILE *fp; if((fp = fopen("yes.txt", "r+")) != NULL){ pos = 0; while(checker = fread(&y, s
void updateFile(char filename[], int num, int update){
int pos, checker, y;
FILE *fp;
if((fp = fopen("yes.txt", "r+")) != NULL){
pos = 0;
while(checker = fread(&y, sizeof(int), 1, fp) != 0 && y != num){
pos++;
}
if(checker != 0){
fseek(fp, sizeof(int) * pos, SEEK_SET);
fwrite(&update, sizeof(int), 1, fp);
}
fclose(fp);
}
}
文件中的数据是{1,2,3,4,5,6,7,8,9,10}
现在我试图在文件中找到5(num)并将其更改为另一个数字(update)。我所知道的是,fread应该在成功读取数据后返回1,但在我的情况下,在我使用y!找到5后返回1num,fread将0返回给checker,我不知道为什么。我希望它是1而不是0,因此,我无法更新我的文件。请帮忙。当然,你有:
while(checker = fread(&y, sizeof(int), 1, fp) != 0 && y != num){
应该是:
while ((checker = fread(&y, sizeof(int), 1, fp)) != 0 && y != num){
目前,您正在评估
fread(&y,sizeof(int),1,fp)!=0&&y!=num
并将该布尔值(0,1)赋给检查器
,然后测试它是0还是1。如果没有关于传入数据的更多信息,我所能做的只是猜测几件事。还假设while循环运行到完成时没有发现任何内容。T
- 问题。如果文件中的信息不是由编写
的C程序写入的,则文件中的二进制字节顺序可能与您预期的不同李>int
- 假设您正在读取一个具有整数值的二进制文件,尽管后缀为.txt,您应该希望在打开的文件中添加一个“b”选项。否则,您使用的非常低的值可以被视为控制字符,可以通过libc进行过滤。特别是,可以删除或生成\n和\r,具体取决于您运行的操作系统。“b”确保不会发生这种情况。在Linux上,您应该是安全的
- 假设您正在读取一个真正的文本文件,如果您正在传递一个二进制值,那么事情就不会像真的那样工作。txt值不使用50表示“2”,而不是\002李>
“{1,2,3,4,5,6,7,8,9,10}”
是吗?你的意思是它包含二进制,对吗?你怎么能确定你找到了5?while循环后的“pos”值是多少?请在代码中填充临时调试打印(例如,每次迭代后的y
值有助于理解是什么实际导致执行退出循环)。还要回答@trojanfoe的问题,因为如果该文件包含文本,您将不得不对代码进行大量更改。对于这些糟糕的问题,我深表歉意。我对这个网站还是新手,下次我会做得更好。另外,谢谢你的帮助,我现在找到了修复方法,多亏了@Jonathan Leffler