【问题标题】:reading csv to struct [duplicate]将csv读取到结构[重复]
【发布时间】:2015-09-05 14:29:11
【问题描述】:

我正在尝试将文本文件放入结构中

在将文本文件中的值分配给结构时遇到问题,它不断打印我最后一个不完整打印的值。

你能帮我解决这个问题吗?

提前谢谢你。

#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 422498
#define MAX_KEY 128
    struct record
    {
        char* a;
        char* b;
    };

    int main(int argc, char **argv){
        char* input=argv[1];
        char* output=argv[2];
        char* buff[MAX_LEN];


        char *delimiter = ";";


        //printf("%s\n",input);
        //printf("%s\n",output);

        FILE *fp;
        fp = fopen(input, "r"); //opening file*/

        if( fp == NULL )
           {
              perror("Error while opening the file.\n");
              exit(EXIT_FAILURE);
           }
           int rowsNum=0;
           struct record* recArr = malloc(3 * sizeof (struct record));
           //struct record recArr[4];
        //recArr=malloc(1 * 2*sizeof(char*));
           /*recArr[0].a="aa";
           recArr[0].b="bb";
           recArr[1].a="cc";
           recArr[1].b="dd";
           recArr[2].a="ee";
           recArr[2].b="ff";

        printf("%s\n", recArr[0].a);
        printf("%s\n\n", recArr[0].b);
        printf("%s\n", recArr[1].a);
        printf("%s\n\n", recArr[1].b);
        printf("%s\n", recArr[2].a);
        printf("%s\n\n", recArr[2].b);*/
        while (fgets(buff, MAX_LEN, (FILE*)fp)!=NULL)
       {       
            //recArr=realloc(recArr, (rowsNum+1) * 2*sizeof(char*));

            //char* Key = strtok(buff, delimiter);
            //char* Value = strtok(NULL, delimiter);

            recArr[rowsNum].a=strtok(buff, delimiter);
            recArr[rowsNum].b=strtok(NULL, delimiter);

            printf("%s\n", recArr[rowsNum].a);
            printf("%s\n\n", recArr[rowsNum].b);
            /*Key=NULL;
            Value=NULL;*/
            rowsNum++;
            printf("%d\n", rowsNum);
        }
        fclose(fp);

        int i;
        for (i=0;i<3;i++)
        {
            printf("%s\n",  recArr[i].a);
            printf("%s\n\n", recArr[i].b);
        }
        //printf("%d\n", rowsNum);

    }

【问题讨论】:

标签: c csv struct malloc


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // this is needed to use strtok function (and strlen, strcpy)
#define MAX_LEN 422498
#define MAX_KEY 128
    struct record
    {
        char* a;
        char* b;
    };

    int main(int argc, char **argv){
        char* input=argv[1];
        char* output=argv[2];
        char buff[MAX_LEN]; // buff should be char[MAX_LEN], not char*[MAX_LEN]


        char *delimiter = ";";


        //printf("%s\n",input);
        //printf("%s\n",output);

        FILE *fp;
        fp = fopen(input, "r"); //opening file*/

        if( fp == NULL )
           {
              perror("Error while opening the file.\n");
              exit(EXIT_FAILURE);
           }
           int rowsNum=0;
           struct record* recArr = malloc(3 * sizeof (struct record));
           //struct record recArr[4];
        //recArr=malloc(1 * 2*sizeof(char*));
           /*recArr[0].a="aa";
           recArr[0].b="bb";
           recArr[1].a="cc";
           recArr[1].b="dd";
           recArr[2].a="ee";
           recArr[2].b="ff";

        printf("%s\n", recArr[0].a);
        printf("%s\n\n", recArr[0].b);
        printf("%s\n", recArr[1].a);
        printf("%s\n\n", recArr[1].b);
        printf("%s\n", recArr[2].a);
        printf("%s\n\n", recArr[2].b);*/
        while (fgets(buff, MAX_LEN, (FILE*)fp)!=NULL)
       {       
            //recArr=realloc(recArr, (rowsNum+1) * 2*sizeof(char*));

            //char* Key = strtok(buff, delimiter);
            //char* Value = strtok(NULL, delimiter);

            //recArr[rowsNum].a=strtok(buff, delimiter);
            //recArr[rowsNum].b=strtok(NULL, delimiter);
            // you have to COPY the string
            char* a=strtok(buff, delimiter);
            char* b=strtok(NULL, delimiter);
            recArr[rowsNum].a = malloc(sizeof(char) * (strlen(a) + 1)); // +1 for terminating '\0'
            recArr[rowsNum].b = malloc(sizeof(char) * (strlen(b) + 1));
            strcpy(recArr[rowsNum].a, a);
            strcpy(recArr[rowsNum].b, b);

            printf("%s\n", recArr[rowsNum].a);
            printf("%s\n\n", recArr[rowsNum].b);
            /*Key=NULL;
            Value=NULL;*/
            rowsNum++;
            printf("%d\n", rowsNum);
        }
        fclose(fp);

        int i;
        for (i=0;i<3;i++)
        {
            printf("%s\n",  recArr[i].a);
            printf("%s\n\n", recArr[i].b);
        }
        //printf("%d\n", rowsNum);

        // you should free the allocated buffer
        for (i=0;i<3;i++)
        {
            free(recArr[i].a);
            free(recArr[i].b);
        }
        free(recArr);

    }
  • string.h 应该包含在使用 strtok 中:GCC 对此提出了一些警告。
  • buff 的类型不正确:应该是 char buff[MAX_LEN],而不是 char* buff[MAX_LEN](有一个额外的星号)
  • 函数strtok 修改给定的缓冲区并返回指向缓冲区中某处的指针。读取下一行时,缓冲区将被覆盖,并且先前读取的文本会丢失,除非将其复制到某处。出于这个原因,我添加了一些代码来复制字符串读取和保存指针,这些指针指向字符串被复制的位置,而不是buff 中的某个位置。

【讨论】:

  • Mike,您能否添加有关 OP 做错了什么以及您如何在代码中修复该问题的信息?
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2015-01-03
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多