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

问题描述 投票:1回答:2

我正在尝试,以C:

  1. 从文件读取数据
  2. 处理数据
  3. 将操作数据写入另一个文件

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

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

我不熟悉“>”命令。我有几个问题:

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

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

请注意,尽管某些Shell命令仍支持输出重定向,但它们不是单独的程序,但实际上是shell builtins。在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文件。命令输出是否表示stdout?

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

你不知道。这是Shell / OS功能,不属于C。


1
投票
让我们澄清一些事情:

    ><和其他一些符号(与您的问题无关)是命令行解释器(也称为外壳程序)的控制运算符。当shell看到其中任何一个时,它假定程序的命令行参数现在已完成。因此,根据您的情况,您的程序将具有argc=2argv = ["name ", "inputFileName.ext"]
  1. “重定向”的意思是程序通常会通过stdout(在调用printf() putchar()puts()时默认使用此方法)写到屏幕上的任何内容都将写入到以下文件名中在>之后。您的图表完全没有意识到这一事实。在您的代码中,您应该仅假设您正在屏幕上进行打印。执行命令以执行重定向的人员的责任。 (此外:“ outputFileName.ext”不需要存在,如果不存在,则将创建它,但是重定向
  2. 将覆盖该文件中先前写入的所有内容,因此请特别注意不要重定向到.c文件。偶然或您先前执行的结果,如果同时需要它们]])<(不在您的问题中,但密切相关)的工作方式与您想象的相反,程序从该文件而不是从键盘读取输入。 (显然该文件现在需要存在)
  3. 对于问题的第二部分,您仍然可以(并且应该)通过argv[1]的内容访问输入文件的名称。您将打开文件,并通过一些以文件描述符作为参数的C函数从中读取文件(例如fscanf()fgets()getline())。

最后,确定给您的命令是

./name inputFileName.ext > outputFileName.ext

不是

./name < inputFileName.ext > outputFileName.ext

后者将重定向用于输入和输出,并且您在读取时不应做任何不同,只需从stdin正常读取。

© www.soinside.com 2019 - 2024. All rights reserved.