我是C编程的新手,我想访问作为参数传递的文本文件的内容。
当我执行程序时:
./cat 10 60 < dog.txt
当我运行for循环来迭代参数时,它不会打印我作为参数传递的文件。
./cat
10
60
所以,我假设它不被认为是一个论点。但是,有没有一种方法可以像我那样传递文件名作为参数(./cat 10 60 < dog.txt
(,然后访问其内容?
谢谢你的帮助,
<
是shell提供的重定向运算符。
此操作符在其右侧打开文件进行读取,并且在默认情况下,将程序的标准输入(stdin
(重新映射为此文件。
还可以指定哪个文件描述符以以下形式重新映射:
program [n]< file
其中[n]是一个数字。UNIX文件描述符和C标准库流之间的典型映射是
0
-stdin
1
-stdout
2
-stderr
但也可以打开其他文件描述符,并使用man 2 read
从中读取程序。
这是一个示例程序。注意这两组不同命令之间的差异:
这个
./a.out a b < file.txt
将在列出程序参数的部分下打印字符串a
和b
,然后打印file.txt
的内容。
而这个
./a.out a b file.txt
将在列出程序参数的部分下打印字符串a
、b
和file.txt
,然后等待您在终端中键入内容。
#include <stdio.h>
int main(int argc, char **argv) {
size_t line = 0;
char buffer[256];
puts("--- argv ---");
for (int i = 0; i < argc; i++)
printf("arg #%d : %sn", i, argv[i]);
puts("--- stdin ---");
while (fgets(buffer, sizeof buffer, stdin))
printf("%4zu|%s", ++line, buffer);
}
在Unix系统上,每个文件都有三个标准文件描述符(映射到文件的数字(
0-标准1-标准偏差2-Stderr
当您使用重定向符号(<(时,bash会关闭通常从键盘读取的stdin,并将其重新映射到您重定向的文件dog.txt。
您是正确的,它没有作为参数传入,但您仍然可以通过使用read命令从文件0 读取数据
read(0, *buf, buf_size);
E: Barmar指出,应该使用stdio库从输入中读取,这是更标准的