2014-12-08 127 views
0

我需要你的幫助來指出我在做什麼錯讀取文件和寫入另一個文件。問題是我沒有得到任何在我的輸出文件中應寫入結果。目前正在修改我的程序Can't deallocate memory in my C program。現在我應該使用命令行參數來讀取和寫入,到目前爲止沒有成功。我想我的功能有錯誤,但不知道如何解決。這裏不用我的結構的def main()的FUNC從文件讀取和寫入文件的問題C

typedef struct{ 
char name[25]; 
char street[25]; 
char citystate[25]; 
char zip[6]; 
}student; 

    typedef student *studinfo; 

int main(int argc, char *argv[]) 
    { 
     FILE *fp1, *fp2; /* file pointer */ 

     /* see if correct number of command line arguments */ 
     if (argc != 3) { 
      printf("Something wrong with arguments\n"); 
      exit(1); 
     } 

     /* open file for input */ 
     if ((fp1 = fopen(argv[1], "r")) == NULL) { 
      printf("Cannot open file to read \n"); 
      exit(1); 
     } 

     fp2 = fopen(argv[2], "w"); 

     int count = 0; 
     student *studptr[49]; 

     getinfo(studptr, &count, fp1);/*call getinfo function to get student info*/ 

     sortit(studptr, count); /*call sortit function to sort info based on zip code*/ 

     result(studptr, &count, fp2); /*call result function to display sorted result*/ 

     fclose(fp1); 
     fclose(fp2); 

     return 0; 
    } 

和我的功能應該從文件中讀取信息,並在那裏我懷疑我的錯誤是

void getinfo(student *details[], int *count, FILE *fp1) 
    { 

     studinfo info; 

     /*Get student information*/ 
     while (fp1 != NULL) { 
      info = (studinfo)malloc(sizeof(student)); 
      fgets(info->name, 40,fp1); 
      fgets(info->street, 40,fp1); 
      fgets(info->citystate,40,fp1); 
      fgets(info->zip, 40, fp1); 

      details[(*count)++] = info; /*Increase pointer to next position*/ 

     } /* End of while loop*/ 

    } /* End of getinfo */ 

我有一個函數根據郵政編碼和下一個功能對信息進行排序,將排序後的結果寫入下面顯示的新文件中

void result(student *details[], int *count, FILE *fp2) 
    { 
     int i; 
     for (i = 0; i<(*count); i++) { 

      fprintf(fp2,"%s\n%s\n%s\n%s\n", details[i]->name, details[i]->street, details[i]->citystate, details[i]->zip); /* print info*/ 
      fprintf(fp2, "*******************************\n"); 
     } 
    } /* End of result* 
+1

爲什麼不檢查是否'fp2'?你也真的想'typedef學生* studinfo;'而不是'typedef學生studinfo;'?此外,您不會向我們顯示要從中讀取的文件包含的內容。 – 2014-12-08 06:48:22

+2

你的結構定義了大小爲25的字段(除了郵政編碼是6);你的'fgets()'調用假定大小是40.如果有人輸入超過24個字節的數據,你將不會高興。使用'fgets(info-> name,sizeof(info-> name),fp1)'和等價的。另外,檢查EOF(在EOF上'fgets()'的返回值是NULL)。另請注意,'fgets()'包含數據中的換行符;你可能不希望這樣。 – 2014-12-08 06:50:26

+0

在之前的評論中,我注意到:_還注意到'fgets()'包含數據中的換行符;你可能不想要那個。我應該補充說:...並非最不重要,因爲您只能存儲4位數的郵政編碼,再加上換行符,再加上6個字符數組中的空值。你可能會更好地將字符串讀入一個(大)數組中:'char buffer [4096];'和'fgets(buffer,sizeof(buffer),fp1);'然後檢查輸入的長度,並擔心超長的郵政編碼。請記住,'strncpy()'不會終止太長的字符串。 – 2014-12-08 06:58:10

回答

0
int get_line(FILE *fp, char *buffer, size_t buflen) 
{ 
    char line[4096]; 
    assert(buflen > 1); 
    if (fgets(line, sizeof(line), fp) == 0) 
     return EOF; 
    size_t len = strlen(line); 
    if (line[len-1] == '\n') 
     line[--len] = '\0'; 
    if (len >= buflen) 
     len = buflen - 1; 
    memmove(buffer, line, len); 
    buffer[len] = '\0'; 
    return len; 
} 

void getinfo(student *details[], int *count, FILE *fp) 
{ 
    student *info; 

    while ((info = malloc(sizeof(*info)) != 0) 
    { 
     if (get_line(fp, info->name, sizeof(info->name)) == EOF || 
      get_line(fp, info->street, sizeof(info->stree)) == EOF || 
      get_line(fp, info->citystate, sizeof(info->citystate)) == EOF || 
      get_line(fp, info->zip, sizeof(info->zip)) == EOF) 
     { 
      free(info); 
      return; 
     } 
     details[(*count)++] = info; 
    } 
} 
0

while (fp1 != NULL) {:無限循環。 - BLUEPIXY

這確實是主要問題。

我試過while (fgetc(fp1) != EOF) {:沒有工作

因爲fgetc()消耗那是以後的丟失字符工作不正常。

您可以使用以下,用廢棄空間的獎金前:

 while (fscanf(fp1, "%*[ ]") != EOF) 
     { 
      …