将.csv文件读入C中的数组

时间:2017-01-23 03:10:42

标签: c csv parsing

我目前正在尝试将.csv文件读入C中的数组。我对如何处理问题有点不知所措。我已经浏览了很多论坛和相关主题,但我仍然无法掌握它。如果有人能够尽可能简单地向我展示或分解它。非常感谢。顺便说一下,.csv文件的内容是这样的。数组应该只包含字母和数字。我在考虑使用2-D阵列。这是一个合适的解决方案吗?

A,1
B,2
C,3
....

2 个答案:

答案 0 :(得分:1)

首先定义数据结构:

struct my_record {
    char name;
    int value;
};

然后你可以这样读:

FILE* my_file = fopen(...);
struct my_record records[100];
size_t count = 0;
for (; count < sizeof(records)/sizeof(records[0]); ++count)
{
    int got = fscanf(my_file, "%c,%d", &records[count].name, &records[count].value);
    if (got != 2) break; // wrong number of tokens - maybe end of file
}
fclose(my_file);

现在你有一个结构数组,每行一个。

答案 1 :(得分:1)

您可以创建一个结构数组,如另一个答案所述。

获得struct定义后:

typedef struct {
    char letter;
    int number;
} record_t;

然后你可以创建一个这样的结构数组:

record_t records[26]; /* 26 letters in alphabet, can be anything you want */

使用2D数组是不必要的,因为在struct中包装字母和数字会更容易处理。

在阅读文件方面,您只需使用fscanf()阅读,直到找不到2值。

以下是您可以使用的一些基本代码:

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

#define NUMLETTERS 26

typedef struct {
    char letter;
    int number;
} record_t;

int main(void) {
    FILE *fp;
    record_t records[NUMLETTERS];
    size_t count = 0;

    fp = fopen("letters.csv", "r");
    if (fp == NULL) {
        fprintf(stderr, "Error reading file\n");
        return 1;
    }

    while (fscanf(fp, " %c,%d", &records[count].letter, &records[count].number) == 2) {
        count++;
    }

    for (size_t i = 0; i < count; i++) {
        printf("%c,%d\n", records[i].letter, records[i].number);
    }

    fclose(fp);

    return 0;
}