繁体   English   中英

如何将输出重定向到 C 中的文件?

[英]How to redirect output to a file in C?

我正在尝试在 C 中:

  1. 从文件中读取数据
  2. 操作数据
  3. 将操作过的数据写入另一个文件

在分配要求中,它说使用以下命令编译和运行程序:

gcc -o name name.c 
./name inputFileName.ext > outputFileName.ext

我不熟悉“ > ”命令。 我有一些问题:

  1. 在网上,它说“>”将命令输出重定向到一个文件,我不确定“命令输出”到底是什么意思。 我正在将 name.c 文件的输出重定向到 outputFileName.ext 文件。 命令输出是否意味着标准输出? 如果是这样,我将使用哪个 C 关键字将信息从 name.c 作为 stdout 写入 outputFileName.ext 文件?
  2. 当我打开并读取我的输入文件时,我需要访问从命令行传入的文件。 “ > ” 字符算作另一个命令行参数吗? 我仍然可以使用语句“argv[1]”从 main() 访问 inputFileName.ext 吗?

在网上,它说>将命令输出重定向到一个文件,我不确定“命令输出”到底是什么意思。

“命令输出”指的是程序的stdout (标准输出)流。

请注意,某些 shell 命令不是单独的程序,但实际上是shell 内置命令,尽管它们仍将支持输出重定向。 在 Windows 上,大多数 shell 命令(如dirdel )是内置的,而在 Linux/BSD/etc 上,大多数 shell 命令是单独的程序(如lsmkdir

如果您的程序调用puts( "foobar" ); 然后从 Bash 运行./name将在您的终端模拟器中显示“foobar”。 但是如果你运行./name > file.txt那么“foobar”文本将被写入file.txt并且它不会显示在你的终端模拟器中。

尝试使用ls命令,例如: ls -al > files.txt 这也适用于 Windows ( dir /s > files.txt )。

我正在将name.c文件的输出重定向到outputFileName.ext文件。 命令输出是否意味着标准输出?

是的。

如果是这样,我将使用哪个 C 关键字将信息从 name.c 作为 stdout 写入 outputFileName.ext 文件?

你没有。 这是一个 shell/OS 功能,不是 C 的一部分。

让我们澄清一些事情:

  1. ><和其他一些符号(与您的问题无关)是命令行解释器(又名 shell)的控制运算符。 当 shell 看到其中的任何一个时,它假定程序的命令行参数现在已经完成。 所以在你的情况下,你的程序将有argc=2argv = ["name ", "inputFileName.ext"]
  2. “重定向”意味着无论您的程序通常通过stdout (在调用printf() putchar()时默认使用, puts() )写入屏幕的任何内容都将写入>之后的文件名。 你的程序完全不知道这个事实。 在您的代码中,您应该假设您正在屏幕上打印。 执行命令的人负责执行重定向。 (另外:“outputFileName.ext”不需要存在,如果不存在,它将被创建,但重定向将覆盖以前在该文件中写入的任何内容,因此要格外小心,不要意外重定向到 .c 文件或者您之前执行的结果,如果您同时需要它们
  3. < (不是在您的问题中,而是密切相关)与您想象的相反,程序从该文件而不是从键盘读取输入。 (显然该文件现在需要存在)

对于问题的第二部分,您可以(并且应该)通过argv[1]的内容访问输入文件的名称。 您将打开文件并通过一些将文件描述符作为参数的 C 函数(如fscanf()fgets()getline() )从中读取。

最后,你确定给你的命令是

./name inputFileName.ext > outputFileName.ext

并不是

./name < inputFileName.ext > outputFileName.ext

?

后者对输入和输出都使用重定向,并且在读取时不应该做任何不同的事情,只需从stdin正常读取即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM