2014-11-25 610 views
-2

所以我想弄清楚如何使用fscanf从文件中读取多行。该文件看起来是这样的:在c中使用fscanf()读取多行

8 
1 8 
1 7 
1 9 
1 8 
3 2 
3 8 
0 0 
1 5 
2 4 
0 0 

第一个数字我想获得将是一个数组我将创建,所以我只会将其设置为N(在这个例子中,这个数字是对的大小8开头)。 以下数字将如下所示:最左边的数字将告诉我我阵列中的哪个索引我将在我创建的列表中排列最右边的数字。 零点只是表示我将终止的位置。 我试图做到这一点迄今的方法是:

fscanf(in, "%d", &n) 
//have obtained n 
arr[n]; 
while(fgets(line, MAX_LEN, in) != NULL){ 
fscanf(in, "%d %d", &x, &y); 
//from here I place them in their corresponding arrays 
} 
+3

欢迎的StackOverflow!本网站不是代码编写服务。请发布您到目前为止所尝试的内容以及您有任何具体问题,我们可以提供帮助。 – 2014-11-25 05:07:39

+0

嗨!好的,我刚刚更新了它,我想我最不清楚的是fscanf()如何工作读取各种行,在第一行读完后它会继续在第二行吗?并继续前进,直到我的while循环终止? – jdawg1121 2014-11-25 05:13:26

+0

您是否阅读过[fscanf(3)]的文档(http://man7.org/linux/man-pages/man3/fscanf.3.html)?你应该测试它的结果! – 2014-11-25 05:50:53

回答

0

代码:

int main() 
{ 
    int i, j, k; 

    scanf ("%d\n", &i); 
     printf ("%d\n", i); 

    while (i){ 
    --i; 
    scanf ("%d %d\n", &j, &k); 
     printf ("%d %d\n", j, k); 

    } 
} 

执行:

./a.out <input.txt 

这是使用文件重定向。另外检查约freopen。如果你使用这个,你不需要担心fscanf语法。如果你认为只有fscanf,那么谷歌有很多例子。请参考。

+2

请注意,'scanf(“%d \ n”,&i);''中的''\ n“''尝试读取比'\ n''后面通常更多的内容,它试图读取下面所有的空白和'scanf ()'只有在检测到非空格或EOF时才会返回。 – chux 2014-11-25 05:57:10

0

1)在fscanf(in, "%d", &n)之后使用fgets()将第一行的'\n'保留在stdin之后,并只读取一小段文字。建议避免混合fgets()fscanf()

2)使用fgets()读取线(好主意),使用sscanf()(或strtol())后读取数字,而不是fscanf()

if (fgets(line, MAX_LEN, in) == NULL) Hanlde_EOF(); 
if (sscanf(line, "%d", &n) != 1) Handle_BadInput(); 
arr[n]; 
while(fgets(line, MAX_LEN, in) != NULL){ 
    if (sscanf(in, "%d %d", &x, &y) != 2) Handle_BadData(); 
    ... 
}