我使用 fwrite() 将结构写入 .dat 文件。结构内容:
typedef struct record {
char firstName[size], lastName[size];
int age;
double grade;
} record;
问题是,当我打开 .dat 文件时,我看到以前的 printf 语句,而其他垃圾文件就是该文件。当 2 个字符串的长度为 - 1 时,不会发生这种情况。在这种情况下,当我打开 .dat 文件时,文件内没有任何以前的 printf 语句,也没有其他垃圾,也没有新行。以下是 .dat 文件的 2 个实例,每种情况一个:
第一种情况:“输入您的选择:”是 main 中的 printf() 字符串参数,其他垃圾我猜更多是 printf 或其他东西
John ΐ[΄¨
Enter your choice:
oφϊHV ”›²Ιό ›²Ιό ¬›²Ιό ®LΨ*John }<f .γp+ oΕd*–Ι oΕd*–Ι0ΰZ΄¨ θ²Ιό ΝΜΜΜΜΜ@Bill ΐ[΄¨
Enter your choice:
oφϊHV ”›²Ιό ›²Ιό ¬›²Ιό ®LΨ*Bill }<f .γp+ oΕd*–Ι oΕd*–Ι0ΰZ΄¨ θ²Ιό @
第二种情况:如果您检查文件中的输出,则不会像以前那样“输入您的选择:”,也没有其他垃圾或新行
MY NAME IS MY NAME IS MY NAME IS MY NAME JOHN JOHN JOHN JOHN E E EEEE EEEEE EE EEEEEEE EE EEEEEEEE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA N ΝΜΜΜΜΜ@WHAT WHAT OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO E E A PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP d @
奇怪的事情(至少对我来说我知道的很少)是在这两种情况下使用 fread() 读取结构记录数据时通常会从文件中恢复。当我 printf() 结构记录的恢复元素时,我得到与输入相同的输出,如下所示(fread() 发生在单独的函数中):
第一个案例:
Record 1 data:
First Name = John
Last Name = John
Age = 23
Grade = 7.700000
Record 2 data:
First Name = Bill
Last Name = Bill
Age = 25
Grade = 7.000000
第二种情况:
Record 1 data:
First Name = MY NAME IS MY NAME IS MY NAME IS MY NAME JOHN JOHN JOHN JOHN E E EEEE EEEEE EE EEEEEEE EE EEEEEEEE
Last Name = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Age = 78
Grade = 7.700000
Record 2 data:
First Name = WHAT WHAT OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Last Name = E E A PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
Age = 100
Grade = 7.000000
请注意,在这两种情况下,文件都以 rb+ 或 wb+ 模式打开。 有没有办法防止 printf() 字符串和其他垃圾在第一种情况下写入文件中?将结构体记录元素放入文件的代码:
// Called from main, file already open in rb+ or wb+ mode
void add(FILE *fp) {
record r;
char firstName[size], lastName[size];
int age, lenFirst, lenLast;
double grade;
printf("\nEnter first name: ");
fgets(firstName, size, stdin);
lenFirst = strlen(firstName);
if(firstName[lenFirst - 1] == '\n') {
firstName[--lenFirst] = '\0';
} else if(lenFirst + 1 == size) {
while(getchar() != '\n');
}
printf("Enter last name: ");
fgets(lastName, size, stdin);
lenLast = strlen(lastName);
if(lastName[lenLast - 1] == '\n') {
lastName[--lenLast] = '\0';
} else if(lenLast + 1 == size) {
while(getchar() != '\n');
}
printf("Enter age: ");
scanf("%d", &age);
while(getchar() != '\n');
printf("Enter grade: ");
scanf("%lf", &grade);
while(getchar() != '\n');
strcpy(r.firstName, firstName);
strcpy(r.lastName, lastName);
r.age = age;
r.grade = grade;
fseek(fp, 0, SEEK_END);
if(fwrite(&r, sizeof(record), 1, fp)) {
printf("\nSuccesfully wrote to file!\n");
} else {
fprintf(stderr, "\nFailure at writing to file! Exiting...\n");
exit(1);
}
}
感谢@001,解决方案相当简单。我没有将结构记录变量声明为
record r;
,而是放置了 record r = {0};
,现在文件内容没有垃圾和新行,如下所示:
John John μQΈ…λ@Bill Bill ΝΜΜΜΜΜ@
或者至少看起来是这样。