我需要你的幫助來指出我在做什麼錯讀取文件和寫入另一個文件。問題是我沒有得到任何在我的輸出文件中應寫入結果。目前正在修改我的程序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*
爲什麼不檢查是否'fp2'?你也真的想'typedef學生* studinfo;'而不是'typedef學生studinfo;'?此外,您不會向我們顯示要從中讀取的文件包含的內容。 – 2014-12-08 06:48:22
你的結構定義了大小爲25的字段(除了郵政編碼是6);你的'fgets()'調用假定大小是40.如果有人輸入超過24個字節的數據,你將不會高興。使用'fgets(info-> name,sizeof(info-> name),fp1)'和等價的。另外,檢查EOF(在EOF上'fgets()'的返回值是NULL)。另請注意,'fgets()'包含數據中的換行符;你可能不希望這樣。 – 2014-12-08 06:50:26
在之前的評論中,我注意到:_還注意到'fgets()'包含數據中的換行符;你可能不想要那個。我應該補充說:...並非最不重要,因爲您只能存儲4位數的郵政編碼,再加上換行符,再加上6個字符數組中的空值。你可能會更好地將字符串讀入一個(大)數組中:'char buffer [4096];'和'fgets(buffer,sizeof(buffer),fp1);'然後檢查輸入的長度,並擔心超長的郵政編碼。請記住,'strncpy()'不會終止太長的字符串。 – 2014-12-08 06:58:10