读取 csv 到结构

reading csv to struct

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

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

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

提前致谢。

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

    }
#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 '[=10=]'
            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修改给定的缓冲区和returns指向缓冲区中某处的指针。读取下一行时,缓冲区将被覆盖,之前读取的文本将丢失,除非将其复制到某个地方。出于这个原因,我添加了一些代码来复制字符串读取和保存指针,这些指针指向字符串被复制的位置而不是 buff 中的某个地方。