Linux重定向到C程序 - 文件读取

时间:2015-03-21 08:44:09

标签: c linux stdin eof fgets

我想使用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必须在某处使用)?

3 个答案:

答案 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* stdinstdoutstderr。对于最后一个示例,它位于标准输出中,但在您的情况下(使用&lt;)它将位于FILE* stdin

基本上,您不需要执行fopen,并且可以使用stdin