0

例如,当我键入test \n test并尝试使用此代码编写它时

FILE *f = fopen(file, "w+");
fflush(f);
if (f==NULL) {
    //perror(f);
    return 0;
}
else{
    int i = fprintf(f, "%s", text);
    if (i>0) {
        fclose(f);

        return  1;
    }
    else{
        fclose(f);

        return 0;
    }
}

然后用这个阅读它

FILE *f = fopen(file, "r");
static char c[100000];
const char *d;
if (f!=NULL) {
    if (fgets(c, 100000, f) !=NULL){
        d = c;
    }
    else{
        d = "No text";
    }
}
else{
    /*
     char *ff = f;
     perror(ff);
     */
    d = "File not found";
}
fclose(f);

return d;

它只会读写test,不会test,换行,test。为什么这行不通?

4

2 回答 2

5

fgets()函数读取到它遇到的第一个换行符,或者当它用完存储结果的空间或当它获得 EOF 时停止(因此没有更多数据要读取)。

随后的调用fgets()将在第一个换行符之后收集信息。

如果您想一次阅读全部内容,请考虑fread(). OTOH,您也必须在那里解决一些问题(特别是:(1)您可能要求最多 1000 个字节,但只能返回 20 个字节,因此您的代码必须正确处理短读取;和(2)fread()不会为您终止输入字符串,不像fgets()等)。

在编写方面,fwrite()将是对 的逻辑补充fread(),但您可以很好地继续使用fprintf()和朋友,或fputs(),或putc(),或任何其他标准 I/O 编写功能。对于“如果您使用这些函数编写,则必须使用这些其他函数阅读”没有正式的限制。这取决于您正在编写和阅读的内容的性质,但您通常可以自由切换,因为看起来最方便。

于 2013-03-18T01:53:47.240 回答
3

http://www.cplusplus.com/reference/cstdio/fgets/

从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。

于 2013-03-18T01:53:38.363 回答