问题描述
一切似乎都还可以,程序正在运行,但是我的report.txt文件为空。有一个警告-“传递'fwrite'的参数2会使指针不经过强制转换而变成整数”。可能是什么问题? (以下是一些代码)
int main(int argc,char *argv[]) {
FILE *fr = fopen("report.txt","wb");
FILE *db = NULL;
if (argc > 1) // open database file for reading,provide a parameter or use default "db.bin"
db = fopen(argv[1],"rb");
else
db = fopen("db.bin","rb");
if (db) {
Student students[1000]; // all the data goes here
int size = 20; // how many students in database
fread(&size,sizeof(int),1,db); // reading data from file
for (int i = 0; i < size; i++)
fread(&students[i],sizeof(Student),db);
printf("%d records loaded succesfully\n",size);
// MODIFY CODE BELOW
int counterDemo = 0; // for counting students
for (int i = 0; i < size; ++i) { // process all the student records in database
Student s = students[i]; // store data for each student in s
if(s.load == 0) { // *** first filter,conditions on the student
printf("Name - %s,surname - %s,course - %d,average grade - %f,number of courses %d\n ",s.name,s.surname,s.course,s.average,s.load);
int anotherDemo = 0; // for counting courses/grades
for (int i = 0; i < s.load; ++i) { // process each course taken by the student
if(1) { // *** second filter,conditions on the course/grade
++anotherDemo; // counting courses
printf("Course name - %s,course grades - %d\n ",s.courses[i],s.grades[i]);
}
}
printf("Languages - %s\n",s.languages);
printf("\n");
if (anotherDemo == s.load) // *** third filter,varIoUs other conditions
++counterDemo; // counting studfents
fwrite("%s %s",&s.name,&s.surname,fr);
}
}
printf("Filter applied,%d students found\n",counterDemo); // how many passed the filters
fclose(db);
} else
printf("File db.bin not found,check current folder\n");
return 0;
}
解决方法
为警告起见here,fwrite
不像printf
,您需要这样写:
fwrite(s.name,strlen(s.name),1,db);
fwrite(s.surname,strlen(s.surname),db);
,
您的代码:
fwrite("%s %s",&s.name,&s.surname,fr);
我的解决方法:
fprintf(fr,"%s %s",s.name,s.surname);
您像fprintf一样使用了fwrite
所有写入功能都无法获取%s%i%d ..etc之类的参数 http://manpagesfr.free.fr/man/man3/fread.3.html(人就是生命♥o♥)
如果您没有给\ 0加上一个字符串,那么write也不会“写入” \ 0。