c-Sscanf读取一行两次



我只想从文本文件中读取数字,对它们做些什么,然后继续前进。

文本文件的格式如下:

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,%dn",&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]
...

我很困惑它为什么要这么做。。。

如果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,%dn",&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]

接受应答后

出现意外空行的问题的关键只是读取文件输入的一个潜在问题。与其一个接一个地解决问题,不如使用更健壮的错误处理。

格式中"%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] == '') 
          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 s。

最新更新