使用C中的输入重定向从文件中读取行

时间:2014-01-25 00:10:05

标签: c io

我要做的是使用scanf逐行读取文件。我正在使用scanf,因为输入文件需要在编译时重定向。 ./a.out < inputFile

一开始就成功了,使用:

while(scanf("%[^\n]%*c", &line) == 1) {          
             printf("%s\n",line);
}

其中逐行打印文件,但是当我想在读取一堆行之前读取2个整数(例如)时:

0 4
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE

事先使用scanf:

scanf("%d %d", &a, &b);
while(scanf("%[^\n]%*c", &line) == 1) {          
                 printf("%s\n",line);
    }

它不起作用。这是什么原因?或者有更好的方法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您需要使用整数扫描行尾的\ n。

momerath:~ mgregory$ cat foo.txt
0 4
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
momerath:~ mgregory$ cat foo.c
#include <stdlib.h>
#include <stdio.h>

int main(){

  int a,b;
  char line[100];

  scanf("%d %d\n", &a, &b); 
  while(scanf("%[^\n]%*c", &line) == 1) {          
    printf("%s\n",line);
  }
}
momerath:~ mgregory$ gcc foo.c
foo.c:10:28: warning: format specifies type 'char *' but the argument has type
      'char (*)[100]' [-Wformat]
  while(scanf("%[^\n]%*c", &line) == 1) {          
               ~~~~        ^~~~~
1 warning generated.
momerath:~ mgregory$ ./a.out < foo.txt
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
IWANTTOREADTHISLINE
momerath:~ mgregory$ 

答案 1 :(得分:0)

您是否有使用输入重定向的原因?既然你问过是否有更好的方法,我建议你简单地传递你想要作为参数阅读的文件的名称。例如,要读取文件foo.txt,您将使用

./a.out foo.txt

这是一个如何工作的例子:

#include <stdio.h>

int main(int argc, char* argv[]) {
  if(argc < 2) {
    printf("Please pass a filename as an argument\n");
    return -1;
  }

  FILE* fp;       // file pointer
  char buf[200];  // buffer to hold a line of text

  // open file, name stored in argv[1]
  if((fp = fopen(argv[1], "r")) == NULL) {
    printf("Error opening file %s\n", argv[1]);
    return -1;
  }
  while(fgets(buf, sizeof(buf), fp) != NULL) {
    // do stuff with the string, stored in buf
    printf("%s", buf);
  }

  // close the file and exit
  fclose(fp);
  return 0;
}

请注意,argc是一个参数计数器,而argv []是一个参数数组。您可以通过这种方式将多个参数传递给您的程序。干杯!