将.csv文件读入包含在头文件中的结构中

时间:2017-02-07 18:12:52

标签: c csv struct header

我正在尝试阅读csv。将文件放入结构体中,结构体在单独的.h文件中创建,并包含在#include“filedata.h”中。然而,我在阅读结构时遇到了麻烦。

我的结构在我的filedata.h文件中定义为

#ifndef filedata
#define filedata

typedef struct {
     char *data1;
     char *data2;
     char yN;
}filedata;

#endif

我的.c文件包含:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "filedata.h"

filedata data[5]; //instantiates struct?

int main(){

const char s[3] = ", ";
int i = 0;
char line [256];
char *temp;

FILE *fp = fopen("filename.csv", "r");
if(fp==NULL){
   perror("File not found!\n");
   return 1;}

while(fgets(line, sizeof(line), fp)){
   temp = strtok(line, s);
   strcpy(data[i].&data1, temp);
   <etc>
   i++;}
fclose(fp);
}

我一直在'&amp;'之前获得“预期的标识符”令牌”。如何正确访问结构?提前谢谢。

2 个答案:

答案 0 :(得分:0)

您需要为字符串data[i].data1预留空间,在malloc之前使用strcpy

size_t sz = strlen(temp) + 1;

/* You don't need the address of (&) operator, data1 is already a pointer */
data[i].data1 = malloc(sz);
if (data[i].data1 == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}
strcpy(data[i].data1, temp);

strdup(不是标准但在许多实现中可用):

data[i].data1 = strdup(temp);
if (data[i].data1 == NULL) {
    perror("strdup");
    exit(EXIT_FAILURE);
}

在两种情况下都不再需要free(data[i].data1);时,不要忘记。

答案 1 :(得分:0)

strcpy(data[i].&data1, temp);这是一个语法错误,因为您无法在变量的中间进行引用。

您根本不需要引用,因为data1字段已经是char上的指针。您只需要正确分配(复制)字符串并像这样分配:

data[i].data1 = strdup(strtok(line, s))

由于strtok没有为您分配内存,因此返回的值绑定到line(下一行读取:您的数据将丢失)

(BTW不需要temp