我想使用C中的函数从文本文件(filename.txt
)中读取数字行。
如何打开此文件(如果文件名仅通过Unix上的重定向提供)?
i.e. ./cfile < filename.txt
int main (void)
{
char filename[20];
fgets(filename, 19, stdin);
FILE *fp;
fp = fopen(filename, "r");
}
那么,这是否正确;另外,如何从文件中一次访问一行(我知道EOF必须在某处使用)?
答案 0 :(得分:0)
filename.txt
的内容会被重定向到可执行文件的标准输入。因此,您可以按如下方式编写代码:
#include <stdio.h>
#define MAXLEN 256 // Maximum number of characters in a line
int main() {
char line[MAXLEN];
while (fgets(line, MAXLEN, stdin)) {
printf("Line %s", line); // Do something with the line
}
return 0;
}
答案 1 :(得分:0)
<
用于重定向文件而非键盘的标准输入,在这种情况下,您不需要fopen
:
int main(void)
{
char buffer[100];
/* Don't use magic numbers with fgets, sizeof buffer is the correct size */
while (fgets(buffer, sizeof buffer, stdin)) {
printf("%s", buffer);
}
return 0;
}
您可以使用传递给main的参数fopen
文件:
int main(int argc, char *argv[])
{
char buffer[100];
FILE *fp;
if (argc == 2) {
fp = fopen(argv[1], "r");
if (fp == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while (fgets(buffer, sizeof buffer, fp)) {
printf("%s", buffer);
}
fclose(fp);
}
return 0;
}
使用./cfile filename.txt
启动它(没有重定向)。
答案 2 :(得分:0)
在Linux上,当您运行程序时,会为标准输入(fd 0),输出(fd 1)和错误(fd 2)打开3个文件。默认情况下,这些文件是您的终端:
% cat &
% ls -l /proc/`pidof cat`/fd
total 0
lrwx------ 1 max max 64 mars 21 10:34 0 -> /dev/pts/0
lrwx------ 1 max max 64 mars 21 10:34 1 -> /dev/pts/0
lrwx------ 1 max max 64 mars 21 10:34 2 -> /dev/pts/0
但您也可以指定应与&lt ;,&gt;一起使用的文件和2> :
% cat > /dev/null &
% ls -l /proc/`pidof cat`/fd
total 0
lrwx------ 1 max max 64 mars 21 10:36 0 -> /dev/pts/0
l-wx------ 1 max max 64 mars 21 10:36 1 -> /dev/null
lrwx------ 1 max max 64 mars 21 10:36 2 -> /dev/pts/0
因此,该文件已经打开,分别位于FILE* stdin
,stdout
和stderr
。对于最后一个示例,它位于标准输出中,但在您的情况下(使用&lt;)它将位于FILE* stdin
。
基本上,您不需要执行fopen
,并且可以使用stdin
。