C的文件多字符串排列

标签 c

伙计们,我在文件中输入多个字符串时遇到问题,它排列不正确,这是我的代码:

char input[5];
int i;

FILE * data;
data = fopen("data.txt", "w");


for(i=0; i<3; i++){
data = fopen("data.txt", "a");
scanf("%s", input);
fprintf(data, "%s ", input);

}

fclose(data);

当我输入这样的输入时:a b c

文件中的输出是:c a b

无论发生什么,它总是会发生:1 2 3 变成 3 1 2, 3 6 9 变成 9 3 6

我不知道出了什么问题,请帮助我,并对我的语法错误表示歉意:)

最佳答案

原因是文件句柄数据是 block 缓冲的。

在这一部分:

for(i=0; i<3; i++){
    data = fopen("data.txt", "a");
    scanf("%s", input);
    fprintf(data, "%s ", input);
}

您打开三个文件句柄并向每个文件句柄写入一些字符串,比方说

1
2
3

现在在这里

fclose(data);

您首先关闭最后文件句柄,这会导致缓冲区数据刷新到文件。所以 3 排在第一位。

然后,在程序退出时,其他文件句柄将按照您打开它们的顺序隐式关闭,因此 12 会刷新到您的文件中。

这解释了您观察到的项目的奇怪顺序。 解决方案是仅打开文件一次,例如将循环修改为:

for(i=0; i<3; i++) {
    scanf("%s", input);
    fprintf(data, "%s ", input);
}

现在文件只打开一次。

关于C的文件多字符串排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760665/

相关文章:

c - 使用 SQL Server 管理对象还原 1 个 SQL Server .bak 文件中包含的多个数据库

c - 如何知道字符串指针在重新分配后是否真的变小了?

python - 如何防止动态库多次初始化

c++ - 编译 C 代码,看不到 #define 常量

c - C中的生产者/消费者,带有pthread信号量和多线程

c - Raspberry 微内核,似乎什么都不做

c - C 编程中的段错误(核心转储)

调用带参数的 perl 例程

c - 在 Autoconf 项目中强制执行严格的 C99

c - 信号量模拟程序: Segmentation Fault error