我声明了这个结构:
typedef struct {
char *TITLE;
char *AUTHOR;
char *PUBLISHER;
int YEAR;
char *LANGUAGE;
int PAGES;
float PRICE;
} Book;
我正在尝试使用下面的函数在一个名为“BD_Books.bin”的空文件中写入二进制一本书。:
void InsertBook(Book *L){
FILE *arq = fopen("BD_books.bin", "rb+");
if(arq == NULL){
printf("ERROR WHILE OPENING FILE!!");
return;
}
int regFile = -1;
fseek(arq, 0, SEEK_SET); //setting "pointer" to the beggining of file
fscanf(arq, "%d", ®File); //reading first integer from file
if(regFile == -1){ //if the file is empty
fwrite(L->TITLE, sizeof(char), strlen(L->TITLE), arq);
fwrite(L->AUTHOR, sizeof(char), strlen(L->AUTHOR), arq);
fwrite(L->PUBLISHER, sizeof(char), strlen(L->PUBLISHER), arq);
fprintf(arq, "%d", L->YEAR);
fwrite(L->LANGUAGE, sizeof(char), strlen(L->LANGUAGE), arq);
fprintf(arq, "%d", L->PAGES);
fprintf(arq, "%f", L->PRICE);
return;
}
我可以按照我想要的方式编写所有数据,但问题是我必须以二进制格式编写它,但是函数os写为文本。
是不是fopen("BD_books.bin", "rb+");
足以告诉fwrite()
将所有数据写为二进制,因为我用“rb +”参数打开文件?
答案 0 :(得分:2)
因为您需要使用fwrite()
而不是fprintf()
,fprintf()
会将字符串写入文件,其字节表示形式与其字符串表示形式相同。
尝试chaging
fprintf(arq, "%d", L->YEAR);
与
fwrite(&L->YEAR, sizeof(L->YEAR), 1, arq);
此外,sizeof(char)
保证为1
,因此使用它会为代码添加不必要的丑陋,使其难以阅读。
答案 1 :(得分:1)
我认为不是rb而应该是wb,因为你正在写文件。