2017-01-23 15 views
1

Ich versuche derzeit, eine .csv-Datei in ein Array in C zu lesen. Ich bin etwas auf dem Zaun, wie das Problem anzugehen. Ich habe viele Foren und verwandte Themen durchgesehen, aber ich kann es immer noch nicht verstehen. Wenn jemand es mir zeigen oder es so einfach wie möglich brechen könnte. Das würde sehr geschätzt werden. Der Inhalt der .csv-Datei ist übrigens so. Das Array sollte nur aus dem Alphabet und der Zahl bestehen. Ich habe über eine 2-D-Anordnung nachgedacht. Ist das eine angemessene Lösung?Lesen von .csv-Datei in ein Array in C

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

Ja, es ist etwas eine doppelte Frage, und ich habe im Forum einen Blick darauf werfen, bevor diese zu machen. Ich verstehe es immer noch nicht. – mac

Antwort

1

Beginnen Sie mit der Datenstruktur zu definieren:

struct my_record { 
    char name; 
    int value; 
}; 

Dann können Sie wie folgt lesen:

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

Jetzt haben Sie eine 1D-Array von Strukturen, eine für jede Zeile.

+0

Was ist zu tun, wenn die Anzahl der Einträge in einer Zeile variiert? –

+0

@Plutoniumsmuggler: Dann können Sie für jede Zeile einen 'std :: vector ' speichern. –

+0

C hat keine std :: Vektoren. Ich meinte c nicht C++ (wie die Frage sagt) –

0

Sie können einfach ein Array von Strukturen erstellen, wie die andere Antwort beschrieben.

Einmal haben Sie die struct Definition:

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

Dann können Sie ein Array von Strukturen wie folgt erstellen:

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

ein 2D-Array unnötig wäre, als den Brief Einwickeln und Nummer in einem struct wäre einfacher zu handhaben.

In Bezug auf das Lesen Ihrer Datei können Sie einfach mit fscanf() lesen, bis 2 Werte nicht gefunden werden.

Hier einige grundlegende Code, den Sie verwenden können:

#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; 
}