我要做的是使用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);
}
它不起作用。这是什么原因?或者有更好的方法吗?谢谢!
答案 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 []是一个参数数组。您可以通过这种方式将多个参数传递给您的程序。干杯!