【问题标题】:Reading .csv file into an array in C [duplicate]将.csv文件读入C中的数组[重复]
【发布时间】:2017-06-07 12:20:02
【问题描述】:

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

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

【问题讨论】:

  • 是的,这是一个重复的问题,在做这个之前我确实看过论坛。我还是不明白。

标签: c csv parsing


【解决方案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);

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

【讨论】:

  • 如果一行中的条目数不同怎么办?
  • @Plutoniumsmuggler:然后你可以为每一行存储一个std::vector&lt;my_record&gt;
  • C 没有 std::vectors。我的意思是 c 而不是 C++(正如问题所说)
  • @Plutoniumsmuggler:抱歉,我在回复您的评论时忘记了。在 C 中,您可以使用手头的任何动态数组类。如果你没有,你可以试试这个:developer.gnome.org/glib/stable/glib-Arrays.html
【解决方案2】:

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

一旦你有了struct 定义:

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

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

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

没有必要使用二维数组,因为将字母和数字包含在 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;
} 

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 2023-03-30
    • 2015-05-16
    • 2013-12-16
    • 2012-08-19
    • 2015-06-25
    • 2011-05-16
    • 2020-06-14
    • 2014-03-15
    相关资源
    最近更新 更多