2015-09-05 221 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做錯了,以及如何你在代碼中解決了這個問題? –