Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 即使找到其中的数据,fread仍返回0_C - Fatal编程技术网

C 即使找到其中的数据,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

我需要这段代码的帮助,我正在尝试更新我的文件,我的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, 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

  • 问题。如果文件中的信息不是由编写
    int
    的C程序写入的,则文件中的二进制字节顺序可能与您预期的不同
  • 假设您正在读取一个具有整数值的二进制文件,尽管后缀为.txt,您应该希望在打开的文件中添加一个“b”选项。否则,您使用的非常低的值可以被视为控制字符,可以通过libc进行过滤。特别是,可以删除或生成\n和\r,具体取决于您运行的操作系统。“b”确保不会发生这种情况。在Linux上,您应该是安全的
  • 假设您正在读取一个真正的文本文件,如果您正在传递一个二进制值,那么事情就不会像真的那样工作。txt值不使用50表示“2”,而不是\002
当你说“文件中的数据是{1,2,3,4,5,6,7,8,9,10}”时,你不是指文本
“{1,2,3,4,5,6,7,8,9,10}”
是吗?你的意思是它包含二进制,对吗?你怎么能确定你找到了5?while循环后的“pos”值是多少?请在代码中填充临时调试打印(例如,每次迭代后的
y
值有助于理解是什么实际导致执行退出循环)。还要回答@trojanfoe的问题,因为如果该文件包含文本,您将不得不对代码进行大量更改。对于这些糟糕的问题,我深表歉意。我对这个网站还是新手,下次我会做得更好。另外,谢谢你的帮助,我现在找到了修复方法,多亏了@Jonathan Leffler