w+ 尝试读取文件内容时不起作用
w+ not working when trying to read file content
代码:
#include <stdio.h>
void main() {
FILE *ptr;
char buff[255];
ptr = fopen("Test.txt", "w+");
if (ptr != NULL) {
printf("Success\n");
}
fputs("Hello", ptr);
fgets(buff, 255, (FILE *)ptr);
printf("%s", buff);
fclose(ptr);
}
文件"Text.txt"打开的时候内容是"Hello",但是用fgets
就是打印不出来。我这里做错了什么?
您在阅读前没有倒回文件。 fseek(ptr, 0, SEEK_SET);
或 rewind(ptr);
阅读,例如https://en.cppreference.com/w/c/io/fopen
由我大胆
In update mode ('+'), both input and output may be performed, but output cannot be followed by input without an intervening call to fflush, fseek, fsetpos or rewind, and input cannot be followed by output without an intervening call to fseek, fsetpos or rewind, unless the input operation encountered end of file. In update mode, implementations are permitted to use binary mode even when text mode is specified.
您的代码中存在多个问题:
您必须发出对 fseek()
、fsetpos()
或 rewind()
的调用以在流的写入和读取之间切换,反之亦然。
没有参数的 main
的原型是 int main(void)
.
不需要在fgets(buff, 255, (FILE *)ptr);
中施放ptr
。无用的转换可以隐藏类型不匹配和其他类似的错误。
在将 buff
传递给 printf()
之前,您没有测试 fgets()
的 return 值。如果 fgets()
失败,这有未定义的行为,在你的情况下它确实如此。
您确实测试了 fopen()
的 return 值,但仍然将可能为空的 ptr
传递给其他流函数,调用未定义的行为。
这是更正后的版本:
#include <stdio.h>
int main(void) {
FILE *ptr;
char buff[255];
ptr = fopen("Test.txt", "w+");
if (ptr == NULL) {
printf("Cannot open Test.txt\n");
return 1;
}
printf("Success\n");
fputs("Hello", ptr);
rewind(ptr);
if (fgets(buff, sizeof buff, ptr)) {
printf("%s", buff);
} else {
printf("Cannot read from stream\n");
}
fclose(ptr);
return 0;
}
代码:
#include <stdio.h>
void main() {
FILE *ptr;
char buff[255];
ptr = fopen("Test.txt", "w+");
if (ptr != NULL) {
printf("Success\n");
}
fputs("Hello", ptr);
fgets(buff, 255, (FILE *)ptr);
printf("%s", buff);
fclose(ptr);
}
文件"Text.txt"打开的时候内容是"Hello",但是用fgets
就是打印不出来。我这里做错了什么?
您在阅读前没有倒回文件。 fseek(ptr, 0, SEEK_SET);
或 rewind(ptr);
阅读,例如https://en.cppreference.com/w/c/io/fopen
由我大胆
In update mode ('+'), both input and output may be performed, but output cannot be followed by input without an intervening call to fflush, fseek, fsetpos or rewind, and input cannot be followed by output without an intervening call to fseek, fsetpos or rewind, unless the input operation encountered end of file. In update mode, implementations are permitted to use binary mode even when text mode is specified.
您的代码中存在多个问题:
您必须发出对
fseek()
、fsetpos()
或rewind()
的调用以在流的写入和读取之间切换,反之亦然。没有参数的
main
的原型是int main(void)
.不需要在
fgets(buff, 255, (FILE *)ptr);
中施放ptr
。无用的转换可以隐藏类型不匹配和其他类似的错误。在将
buff
传递给printf()
之前,您没有测试fgets()
的 return 值。如果fgets()
失败,这有未定义的行为,在你的情况下它确实如此。您确实测试了
fopen()
的 return 值,但仍然将可能为空的ptr
传递给其他流函数,调用未定义的行为。
这是更正后的版本:
#include <stdio.h>
int main(void) {
FILE *ptr;
char buff[255];
ptr = fopen("Test.txt", "w+");
if (ptr == NULL) {
printf("Cannot open Test.txt\n");
return 1;
}
printf("Success\n");
fputs("Hello", ptr);
rewind(ptr);
if (fgets(buff, sizeof buff, ptr)) {
printf("%s", buff);
} else {
printf("Cannot read from stream\n");
}
fclose(ptr);
return 0;
}