在C语言中将.csv文件读入数组

4

我目前正在尝试在C语言中将一个.csv文件读入数组中。我对如何解决这个问题还有些犹豫。我已经查看了许多论坛和相关主题,但仍然无法理解。如果有人能够向我展示或尽可能简单地解释一下,那将不胜感激。顺便说一下,.csv文件的内容是这样的。数组应该只包含字母和数字。我考虑使用一个二维数组。这是一个合适的解决方案吗?

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

是的,这有点是一个重复的问题,我在发这个问题之前确实查看了论坛。但我仍然不明白。 - mac
2个回答

5

首先定义您的数据结构:

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);

现在你有一个结构体的一维数组,每行对应一个结构体。

如果一行中的条目数量不同,该怎么办? - Plutonium smuggler
@Plutoniumsmuggler:然后您可以为每行存储 std::vector<my_record> - John Zwinck
C语言没有std::vectors。我的意思是C而不是C++(正如问题所述)。 - Plutonium smuggler
@钚走私者:非常抱歉,在回复你的评论时我忘了。在 C 语言中,你可以使用任何可用的动态数组类。如果没有,你可以尝试这个:https://developer.gnome.org/glib/stable/glib-Arrays.html - John Zwinck

2

你可以像另一个答案所描述的那样,创建结构体数组。

一旦你有了 struct 定义:

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

然后,您可以像这样创建一个结构体数组:
record_t records[26]; /* 26 letters in alphabet, can be anything you want */

使用2D数组是不必要的,因为将字母和数字包装在一个结构体中会更容易处理。
在读取文件方面,您可以使用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;
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接