2017-01-23 56 views
1

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

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

是它有点重复的问题,我也来看看之前做这一个论坛。我仍然不明白。 – mac

回答

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

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

+0

如果某一行中的条目数量有所不同,该怎么办? –

+0

@Plutoniumsmuggler:然后你可以为每一行存储一个'std :: vector '。 –

+0

C没有std :: vectors。我的意思是C不是C++(如问题所述) –

0

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

一旦你拥有了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; 
}