2015-09-05 64 views
1

我试图把文本文件的结构阅读的CSV结构

与分配值格式的文本文件的结构,它一直印在我的最后的值被完全打印的问题。

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

预先感谢您。

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

    } 
+0

提示:'a'和'b'是指针,它们存储地址,而不是整个“字符串”。 – alk

+1

'char * buff [MAX_LEN];' - >'char buff [MAX_LEN];' – chux

+1

到目前为止我发现的第一个重复项:http://stackoverflow.com/q/15033140/694576 http://stackoverflow.com/cn/statoverflow.html/q/27263728/694576还有更多。 – alk

回答

0
#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中的某处。
+1

迈克,你可以请添加关于什么是OP做错了,以及如何你在代码中解决了这个问题? –