首页 > 解决方案 > 无法将所有行 fscanf 到 Struct 数组中

问题描述

我正在尝试将 fscanf() 转换为结构数组。在发表这篇文章之前,我已经遵循了建议的解决方案,但由于某种原因,它似乎并没有读取文件中的所有数据。这只是我需要完成的开始,因为稍后我必须对结构中的项目进行排序。

#define LCOUNT 128  // Sizeof of single line
#define ROW_COUNT 2 // Number of lines in file

struct Hurricane {
    char Year[50];
    char Name[50];  
    char State[50];
};

int main() {
    
    struct Hurricane hurricane[ROW_COUNT]; // Declare hurricane of type Hurricane array
    
    // File operations
    FILE *fptr = fopen("hurricane.txt", "r");
    
    // Return error if file no bueno
    if (fptr == NULL) {
        fprintf (stderr, "Failed to open file");
        return -1;
    }
    
    // Start of row
    int ROW;
    
    // Read comma as delimiter into Struct
    while(ROW != ROW_COUNT) {
        
            fscanf(fptr, "%[^,],%[^,],%[^,]\n", &hurricane[ROW].Year, &hurricane[ROW].Name, &hurricane[ROW].State);
            printf("%s\t%s\t%s\n", hurricane[ROW].Year, hurricane[ROW].Name, hurricane[ROW].State);
            ROW++;
        
    }
        
    // Close file
    fclose(fptr);
    
    return 0;
}

我的文件内容:

1960 年,唐娜,佛罗里达州-北卡罗来纳州

1969 年,卡米尔,MS

1972 年,艾格尼丝,佛罗里达州

然后输出:

1960 年唐娜 FL-NC

1969

-------------------------------- 进程在 0.02288 秒后退出,返回值为 0 按任意键继续。. .

标签: carraysstructscanf

解决方案


  • ROW_COUNT 应该是 3 而不是 2
  • ROW 应该像评论中提到的 bruno 一样初始化:int ROW = 0;
  • fscanf 调用应如下所示

    fscanf(fptr, "%[^,],%[^,],%[^\n]\n", hurricane[ROW].Year, hurricane[ROW].Name, hurricane[ROW].State);
    

如果,%[^,]作为字符串的最后一部分进行搜索,则读取到下一个逗号,但您的行不以逗号结尾。因此最好使用 eg %[^\n]


推荐阅读