【问题标题】:Using fscanf() in c to read multiple lines在 c 中使用 fscanf() 读取多行
【发布时间】:2014-11-25 05:00:27
【问题描述】:

所以我想弄清楚如何使用 fscanf 从 in 文件中读取多行。 in 文件如下所示:

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
}

【问题讨论】:

  • 欢迎来到 StackOverflow!本网站不是代码编写服务。请发布您迄今为止尝试过的内容以及您有任何具体问题,我们可以提供帮助。
  • 嗨!好的,我刚刚更新了它,我想我最不清楚的是 fscanf() 是如何读取各种行的,在我读完第一行之后它会在第二行继续吗?继续进行,直到我的 while 循环终止?
  • 你读过fscanf(3)的文档吗?你应该测试它的结果!

标签: c io


【解决方案1】:

代码:

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,那么 Google 中有很多示例。请参考。

【讨论】:

  • 请注意,scanf ("%d\n", &amp;i); 中的"\n" 会比'\n' 后面的通常读取更多内容。它会尝试读取所有随后的空白,scanf() 将不会返回,直到检测到非空白或EOF
【解决方案2】:

1) 在fscanf(in, "%d", &amp;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();
  ...
}

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多