将CSV文件中的值读入变量

Daw*_*son 8 c file-io input scanf

我正在尝试编写一段简单的代码来读取CSV文件中的值,最多包含100个条目到一个结构数组中.

CSV文件的一行示例:

1,先生,詹姆斯,奎格利,主任,200000,0

我使用以下代码读取值,但是当我打印出值时,它们是不正确的

for(i = 0; i < 3; i++) /*just assuming number of entries here to demonstrate problem*/
    {
    fscanf(f, "%d,%s,%s,%s,%s,%d,%d", &inArray[i].ID, inArray[i].salutation, inArray[i].firstName, inArray[i].surName, inArray[i].position, &inArray[i].sal, &inArray[i].deleted);
    } 
Run Code Online (Sandbox Code Playgroud)

然后,当我打印出第一个名称时,所有值都分配给第一个名称:

for(j = 0; j < 3; j++) /* test by printing values*/
    {
    printf("Employee name is %s\n", inArray[j].firstName);
    } 
Run Code Online (Sandbox Code Playgroud)

ames,Quigley,Director,200000,0以这种方式给予等等.我确信这是我如何格式化fscanf线,但我不能让它工作.

这是我正在阅读的结构:

typedef struct Employee
    {
    int ID;
    char salutation[4];
    char firstName[21];
    char surName[31];
    char position[16];
    int sal;
    int deleted;
    } Employee;
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 17

这是因为字符串%s可以包含逗号,因此它会被扫描到第一个字符串中.scanf()格式化说明符中没有"预见",%s格式规范字符串后面跟着逗号这一事实并不意味着什么.

使用字符组(搜索手册[).

const int got = fscanf(f, "%d,%[^,],%[^,],%[^,],%[^,],%d,%d", &inArray[i].ID,
                       inArray[i].salutation, inArray[i].firstName,
                       inArray[i].surName, inArray[i].position, &inArray[i].sal, 
                       &inArray[i].deleted);
Run Code Online (Sandbox Code Playgroud)

并学会检查返回值,因为I/O调用可能会失败!除非got是7,否则不要依赖有效数据.

为了让你的程序读取整个文件(多个记录,即行),我建议将整行加载到(大)固定大小的缓冲区中fgets(),然后使用sscanf()该缓冲区来解析列值.这更容易,并且将确保您确实扫描单独的行,fscanf()在循环中调用不会,因为fscanf()换行只是空格.