2017-06-16 195 views
-3

在二进制文件mydata.dat中,我写了一个字符串:“这是一个测试”。这是文件的全部内容。我想读取字符串,但我没有看到任何输出。该程序运行没有错误,但。任何想法我做错了什么?为什么不读取输出文件?

FILE *f = fopen("mydata.dat", "rb"); 

char content[100]; 

while(fread(content, sizeof(content), 1, f) == 1){ 
    printf("%s", content); 
} 
fclose(f); 
+2

'fread'不会'== 1'如果没有在文件中100个字节。对于文本,最好使用'“rt”'模式打开文件,然后使用'fgets'。 –

+1

@Zakir,'content'是一个字符串,但'%c'用于打印_a单个'char'_,这是行不通的。 – ForceBru

+0

@WeatherVane:该文件是二进制文件,应该这样处理。 – 4thSpace

回答

4

首先,如果你想读字符,你应该使用fgets()。假设你真的想用fread()

你必须明白fread()返回读取的项目数,所以你的情况是0。因为您要求fread()读取100个字节的1个元素...如果您的文件少于100个字节,这将始终返回0。你已经交换了一个元素的大小和元素的数量。

如果你想让你的数组成为一个有效的C字符串,你必须在末尾放置一个NULL结束符字节。因为fread()不会为你做。

实施例:

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("mydata.dat", "rb"); 

    if (f == NULL) { // Error check 
    perror("fopen()"); 
    return 1; 
    } 

    char content[100]; 
    size_t ret; 

    // We loop on the file to read 99 bytes at each loop 
    // sizeof *content is the size of an element of content 
    while ((ret = fread(content, sizeof *content, sizeof content - 1, f)) > 0) { 
    content[ret] = '\0'; // We use ret to nul terminate our string 
    printf("%s", content); 
    fflush(stdout); // flush the standard output 
    } 

    fclose(f); 
} 
+0

@WeatherVane:如果您尝试运行此代码,则无关紧要,因为没有任何输出。 – 4thSpace

+0

这是保证行为吗?该代码适用于我没有'fflush'。 –

+0

@Stargateur:明白了。谢谢! – 4thSpace

相关问题