C通过shell执行";猫;

C通过shell执行";猫;,c,C,[编辑]-如下面的回答所述,答案是我应该使用fclose而不是close C库的system()函数对我来说运行异常。下面是错误的一个典型例子 我有一个数据文件“file_2.txt”,包含三行数据 file 2 line 1 file 2 line 2 file 2 line 3 下面的C程序将此数据附加到文件_1.txt中,该文件是程序中构建的文件 #include <stdio.h> #include <stdlib.h> int main(int argc,

[编辑]-如下面的回答所述,答案是我应该使用fclose而不是close

C库的
system()
函数对我来说运行异常。下面是错误的一个典型例子

我有一个数据文件“file_2.txt”,包含三行数据

file 2 line 1
file 2 line 2
file 2 line 3
下面的C程序将此数据附加到文件_1.txt中,该文件是程序中构建的文件

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

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

    fprintf(fname,"file 1 line 1\n");
    fprintf(fname,"file 1 line 2\n");
    fprintf(fname,"file 1 line 3\n");
    fprintf(fname,"file 1 line 4\n");
    fprintf(fname,"file 1 line 5\n");

    close(fname);

    system("cat file_2.txt >> file_1.txt");
    system("cat file_1.txt");
}
但我只是得到了

file 2 line 1
file 2 line 2
file 2 line 3
文件\u 1.txt的行发生了什么变化?

使用
fclose(fname)
而不是
close(fname)
close()
函数需要一个文件描述符,它是一个整数而不是
文件*
fclose()
函数是关闭使用
fopen()
打开的文件所需的函数

使用
fclose(fname)
而不是
close(fname)
close()
函数需要一个文件描述符,它是一个整数而不是
文件*
fclose()。当您使用
fprintf()
添加数据时,它可能会存储在用户空间缓冲区中,直到有足够的数据值得进行系统调用。通过调用
close()
系统调用,您在操作系统级别关闭了文件,而libC没有机会刷新与文件关联的缓冲区中的任何未完成数据

EDIT:此外,
fclose()
将文件指针作为参数,而
close()
需要一个文件句柄号,因此在您的程序中
close()
实际上试图关闭垃圾,然后程序结束,没有给libC写入等待数据的机会。

fprintf()
是一个libC函数,它在系统调用
write()
之前放置一个缓冲层。当您使用
fprintf()
添加数据时,它可能会存储在用户空间缓冲区中,直到有足够的数据值得进行系统调用。通过调用
close()
系统调用,您在操作系统级别关闭了文件,而libC没有机会刷新与文件关联的缓冲区中的任何未完成数据



EDIT:此外,
fclose()
将文件指针作为参数,而
close()
需要文件句柄号,因此在您的程序中
close()
实际上试图关闭垃圾,然后程序结束,没有给libC写入等待数据的机会。

如果使用
fopen
也应该使用
fclose
。请参阅手册页以了解fopen/fclose和open/close之间的区别。对C标准库的调用不是A。您的编译器可能给了您一个警告l mine did:
A.C:14:5:警告:函数“close”的隐式声明在C99[-Wimplicit function declaration]close(fname)中无效不要忽略警告!他们经常会告诉你问题出在哪里。不幸的是,我的编译器没有给出任何警告。我正在使用gcc“开箱即用”(gcc版本4.6.3)。学习使用会使gcc警告您的选项。至少使用
-Wall
。我通常使用
gcc-g-O3-std=c11-Wall-Wextra-Wmissing原型-Wstrict原型-Wold样式定义-Werror
,这当然不会让您的代码编译。如果您使用
fopen
,您也应该使用
fclose
。请参阅手册页以了解fopen/fclose和open/close之间的区别。对C标准库的调用不是A。您的编译器可能给了您一个警告l mine did:
A.C:14:5:警告:函数“close”的隐式声明在C99[-Wimplicit function declaration]close(fname)中无效不要忽略警告!他们经常会告诉你问题出在哪里。不幸的是,我的编译器没有给出任何警告。我正在使用gcc“开箱即用”(gcc版本4.6.3)。学习使用会使gcc警告您的选项。至少使用
-Wall
。我通常使用
gcc-g-O3-std=c11-Wall-Wextra-Wmissing prototype-Wstrict prototype-Wold-style definition-Werror
,这当然不会让您的代码编译。将
文件*
传递给
close()
将导致内核尝试关闭与实际文件不对应的随机文件描述符,实际上什么也不做。因此,该文件从未关闭过。(当然,文件缓冲区也没有刷新。)你说得对,我编辑了我的帖子来告诉大家真相。谢谢你的回复。使用fclose修复了这个问题。所谓“文件句柄号”的标准术语是“文件描述符”。变量的一个非常常见的名称是
intfd=open(…),与
文件*fp=fopen(…)相当。将
文件*
传递到
close()
将导致内核尝试关闭一些与实际文件不对应的随机文件描述符,实际上什么也不做。因此,该文件从未关闭过。(当然,文件缓冲区也没有刷新。)你说得对,我编辑了我的帖子来告诉大家真相。谢谢你的回复。使用fclose修复了这个问题。所谓“文件句柄号”的标准术语是“文件描述符”。变量的一个非常常见的名称是
intfd=open(…),与
文件*fp=fopen(…)相当
。感谢您的回复,这确实是因为我使用的是close而不是fclose。感谢您的回复,这确实是因为我使用的是close而不是fclose。
file 2 line 1
file 2 line 2
file 2 line 3