2016-01-21 247 views
2

我只是在学习与FILE s一起工作。我的问题是这样的:当 我想读,是由fopen("example.dat", "ab")打开一个二进制文件,它显示是这样的:读取由fopen(“ab”)打开的二进制文件(add,binary)

this pic

但是当我通过fopen("example.dat", "wb")打开文件,它的工作原理!

这里是我的测试程序:

到文件上写:

#include <stdio.h> 
void main() { 
    int i = 0; 
    FILE *save = fopen("save.dat", "wb"); 
    char str[5][40]; 
    while (i < 5) { 
     gets(str[i]); 
     fwrite(str[i], sizeof(char), 40, save);  
     i++; 
    } 
} 

阅读:

#include <stdio.h> 
void main() { 
    char str2[100][400]; 
    int i = 0; 
    FILE *load = fopen("save.dat", "rb"); 
    if (!load) { 
     printf("cant open file!"); 
     return; 
    } 
    fread(str2[i], sizeof(char), 40, load); 
    while (!feof(load)) { 
     puts(str2[i]); 
     printf("\n"); 
     i++; 
     fread(str2[i], sizeof(char), 40, load); 
    } 
} 

我需要"ab",因为它是关于保存游戏信息,并将其关闭程序后不应删除或再次运行。

和我的英语很抱歉;)

+0

使用,可以显示二进制内容的编辑。 –

+0

@ user3121023我试过删除上次保存的文件上的数据 –

+0

heeyyyy whyy感叹!!!我只是一个可怜的工程师学生 –

回答

1

你的问题的最可能的原因是打开与"ab"文件不截断它,因此要附加到同一个文件,并保持阅读任何不正确的输出那里写着第一。

此外,你的代码有几个问题:

  • 切勿使用gets()。它被从C标准中删除,因为它不能被告知缓冲区有多大,因此不能安全使用。
  • 您对文件结尾的测试不正确:请勿使用feof(),因为它不会执行您认为的操作。它只能告诉你文件的结尾是否被实际试图读过的流函数遇到。您可以简单地测试fread的返回值。
  • 原型为mainint main(int argc, char *argv[])
  • 要么int main(void)您应该检查正确的边界,以防止读取过去str2数组的结尾。

这里是一个修正版本:

#include <stdio.h> 

int main(void) { 
    char str2[100][400]; 
    FILE *load = fopen("save.dat", "rb"); 
    if (!load) { 
     printf("cant open file!\n"); 
     return 1; 
    } 
    for (int i = 0; i < 100 && fread(str2[i], sizeof(char), 40, load) == 40; i++) { 
     puts(str2[i]); 
     printf("\n"); 
    } 
    fclose(load); 
    return 0; 
} 
+0

tnx为您的更正和帮助它是如此的有益,我试过你的新代码,但它没有再次正确工作同样的问题@chqrlie –

+0

@AliZeynali:你是否第一次删除'save.dat'文件? – chqrlie

+0

我没有移除但删除所有数据chqrlie –