2016-07-24 132 views
-1

我有一些代码,像这样写一个char *二进制文件:字符串写入到二进制文件用C

FILE *fp = fopen(path, "wb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 

fwrite("Hello", 6, 1, fp); 

的问题是,当我再从该文件中像这样写着:

FILE *fp = fopen(path, "rb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 


char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

我得到不同的结果,例如OelloMello。到底是怎么回事?

+0

你从来没有设置'char * str'或者我错了吗? –

+2

发布**全部**您的代码。你发布的代码已经读入'id':'fread(id,6,1,fp);'(* maybe * reading - 你不检查返回值...),但是你发出任何内容未初始化的变量'str'指向:'printf(“Got str:%s \ n”,str);' –

+0

对不起,这是一个错字。我正在阅读str变量。该ID来自以前的实现,我改变了str,所以我可以测试出了什么问题。 –

回答

1

该代码是不正确:

char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

char *str;创建未初始化字符指针。它指向的内存在哪里?

char str[ 7 ]; 
fread(str, sizeof(str) - 1, 1, fp); 
str[ sizeof(str) - 1 ] = '\0'; 
printf("Got str: %s\n", str); 

效果会更好,但它仍无法从fread()检查返回值,以确保数据的实际读取。

+0

啊。是的,我的坏。我认为指针后面的内存将被'read'安全地填充。所以'read'会创建char数组并将str *设置为指向它。 –

0

您还没有分配的内存为str

char *str ; // You haven't allocated memory for it , Do 
str=malloc(6*sizeof *str); 

然后做

fread(str, 6, 1, fp); 

而且,如果写入和读取同一翻译单元发生,你应该做的

fclose(fp); // to flush the output buffer and close the file descriptor 

从文件读取之前