如何使用scanf读取空间文件的每一行?

时间:2014-03-28 05:22:53

标签: c printf scanf

所以我试着编写一个可以读取文件每一行的c程序通过命令行传递给它并打印出每一行。我的代码看起来像这样:

#include <stdio.h>
#include <stdlib.h>

int main(void){

        char num[20];
        for (;;){
                if((scanf("%[^\n]s", num)) != 1){
                        break;
                }
                printf("%s\n", num);
        }
}

unix命令行是:./ printeachline&lt; num.txt

num.txt包含以下这些行:

01 0111111119
111122222228
123400000000
1234kk444k44
oooo11111111
o dk39754i2oo
002711111116
124145245 246623
0027111111167
888888888888
100900000011

我打算打印出来的是num.txt中的每一行,但是当我输入命令时,只打印第一行,即01 0111111119.我怎么能解决这个????

4 个答案:

答案 0 :(得分:7)

您的问题的答案不是如何使用scanf()来解决您的问题,而是使用fgets()。已知scanf()容易出错,可能导致缓冲区溢出等。fgets()是设计用于处理每一行的函数:

while (fgets(num, sizeof num, fp) != NULL)
{
    printf("%s", num);
}

fpFILE *的{​​{1}}指针。

答案 1 :(得分:1)

您可以使用fgets()或者如果您使用的是GNU C,那么您可以使用getline()逐行读取输入。或者您可以在程序中添加getchar()循环,然后程序就可以运行。它会读取scanf()留下的换行符。

#include <stdio.h>
#include <stdlib.h>

int main(void){

char num[20];
for (;;){
if((scanf("%[^\n]s", num)) != 1){
break;
}
printf("%s\n", num);
getchar();
}
}

答案 2 :(得分:0)

您的scanf在行尾离开换行符,因此下一个scanf将失败。添加一个getchar()来读取并丢弃换行符。

但是,正如其他人所说,请改用fgets。

答案 3 :(得分:0)

如果您想从文件中读取,那么最好使用文件操作。您可以参考此http://www.thegeekstuff.com/2012/07/c-file-handling/