Sscanf两次读一行?

时间:2014-10-07 12:30:51

标签: c io text-files scanf delimited-text

我想要做的就是从文本文件中读取数字,对它们执行某些操作,然后继续。

文本文件的格式如下:

0,0,16
0,3,17
0,4,10
...etc.

以下是我打印文本文件的代码:

#include <stdio.h>
#include <stdlib.h>
FILE *fp;    

main()
{
        char line[10];
        int row,column,data;
        fp = fopen("data.txt","rt");
        while(fgets(line, 10, fp) != NULL)
        {
            sscanf(line,"%d,%d,%d\n",&row,&column,&data);
            printf("[Row: %d Column: %d Data %d]\n", row, column, data);
        }
        fclose (fp);
}

每当我运行它时,它会输出每一行两次,所以它会显示

[Row: 0 Column: 0 Data 16]
[Row: 0 Column: 0 Data 16]
...

而不是

[Row: 0 Column: 0 Data 16]
...

我很困惑为什么要这样做......

2 个答案:

答案 0 :(得分:3)

如果data.txt中的每条记录后都有空白行,请检查line[0]是否为'\n'

检查此代码是否适合您:

#include <stdio.h>
#include <stdlib.h>
FILE *fp;    

int main()
{
        char line[10];
        int row,column,data;
        fp = fopen("data.txt","rt");
        while(fgets(line, 10, fp) != NULL)
        {
            if(line[0] == '\n')
                continue;
            sscanf(line,"%d,%d,%d\n",&row,&column,&data);
            printf("[Row: %d Column: %d Data %d]\n", row, column, data);
        }
        fclose (fp);
        return 0;
}

输入文件data.txt

0,0,16

0,3,17

0,4,10
1,2,3

<强>输出

[Row: 0 Column: 0 Data 16]
[Row: 0 Column: 3 Data 17]
[Row: 0 Column: 4 Data 10]
[Row: 1 Column: 2 Data 3]

答案 1 :(得分:0)

接受回答后

出现意外空白问题的症结只是读取文件输入的一个潜在问题。而不是逐个解决问题,而是使用更强大的错误处理。

在格式中使用"%n"的节奏记录了扫描的偏移量,并提供了额外的信息来评估线的正确性。

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

int main(void)
{
    FILE *fp;    
    char line[10];
    int row,column,data;
    fp = fopen("data.txt","rt");
    while(fgets(line, sizeof line, fp) != NULL)
    {
        int n1, n2;
        int cnt = sscanf(line," %n%d ,%d ,%d %n", 
            &n1, &row, &column, &data, &n2);
        if (n1 > 0 && line[n1] == '\0') 
          Handle_Line_Is_Entirely_Whitespace();
        else if (cnt != 3 || line[n2]) 
          Handle_IncorrectlyFormattedLine();
        else 
          printf("[Row: %d Column: %d Data %d]\n", row, column, data);
    }
    fclose (fp);
    return 0;  
}

更强大的方法是使用strtol()来扫描int