【发布时间】:2021-01-19 03:18:54
【问题描述】:
我是 C 语言的初学者,我正在尝试使用 fread() 和 fwrite() 等函数来学习文件处理,但是有一个当我从文件中读取字符串并使用printf("%s", var); 输出它时出现问题,这是下面用于测试功能的程序。
#include <stdio.h>
#include <string.h>
void main()
{
FILE *farquivo;
int i;
char text[10];
char file[51] = "string01 string02 string03 string04 string05 ";
farquivo = fopen("dados.txt", "w");
fwrite(file, 1, sizeof(file), farquivo);
fclose(farquivo);
farquivo = fopen("dados.txt", "r");
printf("Sizeof text[] = %d\n", sizeof(text));
printf("Strings by %%s:\n");
fread(text, 1, sizeof(text), farquivo);
printf("%s\n", text);
fread(text, 1, sizeof(text), farquivo);
printf("%s\n", text);
fread(text, 1, sizeof(text), farquivo);
printf("%s\n", text);
fread(text, 1, sizeof(text), farquivo);
printf("%s\n", text);
fread(text, 1, sizeof(text), farquivo);
printf("%s\n", text);
printf("String char by char:\n");
for(i = 0; i < sizeof(text); i++){
printf("%c", text[i]);
}
printf("\n");
fclose(farquivo);
}
一切似乎都还好,但输出很奇怪,这是控制台上的输出:
Sizeof text[] = 10
Strings by %s:
string01 `FÛu>
string02 `FÛu>
string03 `FÛu>
string04 `FÛu>
string05 `FÛu>
String char by char:
string05
Process returned 0 (0x0) execution time : 0.051 s
Press any key to continue.
由于某种原因,当我使用printf("%s", var); 打印字符串时,它的末尾会输出“`FÛu>”,但是如果我一个一个打印字符串的每个字符,这不会发生,我是否在对吗?
【问题讨论】:
-
fread()没有在末尾添加 0 字节,使text不是有效的 C 字符串。 -
C 中的字符串是 nul 终止的。您读取字符串的方法不会在字符串末尾放置一个 nul 字符,因此当您将它们打印出来时,您会在字符串之后得到垃圾。
-
如果你使用
fwrite而不是printf,你不需要有一个以空结尾的字符串。例如,将printfs 替换为fwrite(text, 1, sizeof text, stdout)。 -
虽然 C 中的所有字符串都存在于 char 数组中并且可以这样处理,但 char 数组不一定包含字符串,如果您将其视为字符串而不是字符串,则会得到 undefined行为。
标签: c file output file-handling fread