我有这个代码,用于从文本文件中读取,将信息存储在bin文件中,然后从bin文件中读取信息并将其投影到屏幕上。 我对bin文件的写入都是正确的,除非我将tempStudents打印到屏幕时它总是说明文本文件中的LAST选项。所以就好像唯一的学生就是最后一个学生。
#include<stdlib.h>
#include<stdio.h>
struct student {
char name[200];
float marks;
};
int main() {
FILE * txtFile;
struct student tempStudent;
// File pointer to binary file
FILE * binFile;
int searchNum;
if ((txtFile = fopen("/Users/Ash/Desktop/Lab 8B/input.txt", "r")) == NULL) {
printf("Can not open file input.txt\n");
}
else {
FILE * binFile;
binFile = fopen("/Users/Ash/Desktop/Lab 8B/binFile.bin","w+b");
while (fscanf(txtFile,"%s %f", tempStudent.name, &(tempStudent.marks)) == 2) {
fwrite(tempStudent.name,sizeof(char),sizeof(tempStudent.name),binFile);
fwrite(&tempStudent.marks,sizeof(int),1,binFile);
}
printf("Please enter the student you want to search for\n");
printf("For example if you want the first student type 1\n");
scanf("%d", &searchNum);
int i = 0;
for (i = 0; i <= searchNum; i++)
{
fread(tempStudent.name, 60, sizeof(char),binFile);
fread(&tempStudent.marks,60, sizeof(int),binFile);
}
// write code that reads in the student structure that the user asked for
// from the binary file and store it in the variable tempStudent
printf("The student name retreived is: %s\n", tempStudent.name);
printf("The student mark retreived is: %.2f\n", tempStudent.marks);
fclose(binFile);
fclose(txtFile);
}
return 0;
}
答案 0 :(得分:0)
文件类似于当前位置。将二进制数据写入文件后,此位置结束。当您(尝试)读取此状态下的bin数据时fread
将不读任何内容。
Check the return values!
答案 1 :(得分:0)
您正在将60*sizeof(int)
个字节的数据写入单个float
元素:
struct student {
char name[200];
float marks;
};
struct student tempStudent;
fread(&tempStudent.marks,60,sizeof(int),binFile);
当然,您不能期望此代码能够正常运行!!!
答案 2 :(得分:0)
你总是在寻找一个人:
for (i = 0; i <= searchNum; i++)
如果你想要第一个学生(searchNum = 1
),那么你实际上会做两次阅读。通常这会让你“比我打算阅读的价值多一个”。
更重要的是,如果您正在从文件中读取和写入,则需要确保从正确的位置开始。为此,您拥有fseek()
功能。而不是进行大量的读/写操作,只需确保在读或写之前就在正确的位置。
更重要的是,你似乎有你的名字和标记的可变长度记录 - 这使整个事情变得一团糟。一些建议:
fseek
到特定记录,而无需先读取所有以前的记录。fseek()
。谷歌吧。