fwrite() 无法在二进制文件中写入整数
fwrite() not working to write integer in binary file
谁能告诉我为什么这个功能不起作用?我只是无法理解...
void writeRegister(FILE *arq, Book *L){ //writes in actual file position
char c = '|';
int sizeRegWrite = reglen(L); //reglen() returns the size of Book
fwrite(&sizeRegWrite, sizeof(int), 1, arq);
fwrite(L->TITLE, sizeof(char), strlen(L->TITLE), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->AUTHOR, sizeof(char), strlen(L->AUTHOR), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PUBLISHER, sizeof(char), strlen(L->PUBLISHER), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->LANGUAGE, sizeof(char), strlen(L->LANGUAGE), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PAGES, sizeof(int), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PRICE, sizeof(float), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
return;
}
结构书是这样声明的:
typedef struct {
char *TITLE;
char *AUTHOR;
char *PUBLISHER;
int YEAR;
char *LANGUAGE;
int PAGES;
float PRICE;
} Book;
主要
int main() {
FILE *arq = fopen("BD_books2.bin", "rb+");
if(arq == NULL)
printf("Error while opening file!!!");
Book L;
readData(&L); //Reads all fields from keyboard and places in Book. Working properly
writeRegister(arq, &L);
system("pause");
return 0;
}
我必须在结构中使用这些指针,所以我不能删除它们。顺便说一句,我的问题仅在于 integers
和 float
。
只有当我用 fprintf()
写入所有整数和浮点数(YEAR、PAGES 和 PRICE)时,此函数才能正常工作,但我将其写入二进制文件,当然我想以二进制形式写入,所以我尝试使用 fwrite()。
另一件事是:编译器将 incompatible type for argument 1 of 'fwrite'
指向这一行:fwrite(L->PRICE, sizeof(float), 1, arq);
谁能给我解释一下这是怎么回事? 我的程序在尝试写入文件时崩溃...
fwrite 的第一个参数需要一个指针。
行如下:
fwrite(L->PAGES, sizeof(int), 1, arq);
应该这样写:
fwrite(&(L->PAGES), sizeof(int), 1, arq);
该结构的 YEAR 和 PRICE 成员也是如此
fwrite(&(L->YEAR), sizeof(int), 1, arq);
...
fwrite(&(L->PRICE), sizeof(float), 1, arq);
请注意,您不需要对 TITLE、PUBLISHER 和 AUTHOR 进行相同的更改,因为这些成员字段的类型已经是指针 (char*)。
fwrite
的签名是
std::size_t fwrite( const void* buffer, std::size_t size, std::size_t count, std::FILE* stream );
函数的第一个参数必须是指针。我很惊讶你没有收到以下几行的编译器错误。
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(L->PAGES, sizeof(int), 1, arq);
fwrite(L->PRICE, sizeof(float), 1, arq);
他们需要
fwrite(&(L->YEAR), sizeof(int), 1, arq);
fwrite(&(L->PAGES), sizeof(int), 1, arq);
fwrite(&(L->PRICE), sizeof(float), 1, arq);
此外,检查所有 IO 函数的 return 值以确保它们按您预期的方式工作是一个很好的做法。
if ( fwrite(&(L->YEAR), sizeof(int), 1, arq) != 1 )
{
// Deal with the error condition.
}
您必须将 L->YEAR
的地址传递给 fwrite
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(&(L->YEAR), sizeof(int), 1, arq);
以下代码:
1) eliminates the bad practice of typedef'ing a struct
2) removed the mis-leading all caps of the struct field names
3) contains the needed #includes
4) contains the needed prototypes for the external (in another file) functions
5) checks for the worst of the many possible runtime errors
6) replaces the mis-leading 'L' with a meaningful name
7) modifies the file pointer variable to a commonly known name
suggest compiling with all warnings enabled (and fix the warnings)
for gcc, at a minimum, use '-Wall -Wextra -pednatic'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book
{
char *title;
char *author;
char *publisher;
int year;
char *language;
int pages;
float price;
};
int reglen( struct Book * );
int readData( struct Book * );
void writeRegister(FILE *fp, struct Book *myBook)
{ //writes in actual file position
char c = '|';
int sizeRegWrite = reglen(myBook); //reglen() returns the size of Book
fwrite(&sizeRegWrite, sizeof(int), 1, fp);
fwrite(myBook->title, sizeof(char), strlen(myBook->title), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->author, sizeof(char), strlen(myBook->author), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->publisher, sizeof(char), strlen(myBook->publisher), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->year), sizeof(int), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->language, sizeof(char), strlen(myBook->language), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->pages), sizeof(int), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->price), sizeof(float), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
return;
} // end function: writeRegister
int main( void )
{
FILE *fp = fopen("BD_books2.bin", "rb");
if(fp == NULL)
{
perror( "fopen for BD_books2.bin failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
struct Book myBook;
int goodRead = readData(&myBook); //Reads all fields from keyboard and places in Book. Working properly
if( goodRead )
{
writeRegister(fp, &myBook);
}
system("pause");
return 0;
} // end function: main
谁能告诉我为什么这个功能不起作用?我只是无法理解...
void writeRegister(FILE *arq, Book *L){ //writes in actual file position
char c = '|';
int sizeRegWrite = reglen(L); //reglen() returns the size of Book
fwrite(&sizeRegWrite, sizeof(int), 1, arq);
fwrite(L->TITLE, sizeof(char), strlen(L->TITLE), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->AUTHOR, sizeof(char), strlen(L->AUTHOR), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PUBLISHER, sizeof(char), strlen(L->PUBLISHER), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->LANGUAGE, sizeof(char), strlen(L->LANGUAGE), arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PAGES, sizeof(int), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
fwrite(L->PRICE, sizeof(float), 1, arq);
fwrite(&c, sizeof(char), 1, arq); //writing delimiter
return;
}
结构书是这样声明的:
typedef struct {
char *TITLE;
char *AUTHOR;
char *PUBLISHER;
int YEAR;
char *LANGUAGE;
int PAGES;
float PRICE;
} Book;
主要
int main() {
FILE *arq = fopen("BD_books2.bin", "rb+");
if(arq == NULL)
printf("Error while opening file!!!");
Book L;
readData(&L); //Reads all fields from keyboard and places in Book. Working properly
writeRegister(arq, &L);
system("pause");
return 0;
}
我必须在结构中使用这些指针,所以我不能删除它们。顺便说一句,我的问题仅在于 integers
和 float
。
只有当我用 fprintf()
写入所有整数和浮点数(YEAR、PAGES 和 PRICE)时,此函数才能正常工作,但我将其写入二进制文件,当然我想以二进制形式写入,所以我尝试使用 fwrite()。
另一件事是:编译器将 incompatible type for argument 1 of 'fwrite'
指向这一行:fwrite(L->PRICE, sizeof(float), 1, arq);
谁能给我解释一下这是怎么回事? 我的程序在尝试写入文件时崩溃...
fwrite 的第一个参数需要一个指针。
行如下:
fwrite(L->PAGES, sizeof(int), 1, arq);
应该这样写:
fwrite(&(L->PAGES), sizeof(int), 1, arq);
该结构的 YEAR 和 PRICE 成员也是如此
fwrite(&(L->YEAR), sizeof(int), 1, arq);
...
fwrite(&(L->PRICE), sizeof(float), 1, arq);
请注意,您不需要对 TITLE、PUBLISHER 和 AUTHOR 进行相同的更改,因为这些成员字段的类型已经是指针 (char*)。
fwrite
的签名是
std::size_t fwrite( const void* buffer, std::size_t size, std::size_t count, std::FILE* stream );
函数的第一个参数必须是指针。我很惊讶你没有收到以下几行的编译器错误。
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(L->PAGES, sizeof(int), 1, arq);
fwrite(L->PRICE, sizeof(float), 1, arq);
他们需要
fwrite(&(L->YEAR), sizeof(int), 1, arq);
fwrite(&(L->PAGES), sizeof(int), 1, arq);
fwrite(&(L->PRICE), sizeof(float), 1, arq);
此外,检查所有 IO 函数的 return 值以确保它们按您预期的方式工作是一个很好的做法。
if ( fwrite(&(L->YEAR), sizeof(int), 1, arq) != 1 )
{
// Deal with the error condition.
}
您必须将 L->YEAR
的地址传递给 fwrite
fwrite(L->YEAR, sizeof(int), 1, arq);
fwrite(&(L->YEAR), sizeof(int), 1, arq);
以下代码:
1) eliminates the bad practice of typedef'ing a struct
2) removed the mis-leading all caps of the struct field names
3) contains the needed #includes
4) contains the needed prototypes for the external (in another file) functions
5) checks for the worst of the many possible runtime errors
6) replaces the mis-leading 'L' with a meaningful name
7) modifies the file pointer variable to a commonly known name
suggest compiling with all warnings enabled (and fix the warnings)
for gcc, at a minimum, use '-Wall -Wextra -pednatic'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book
{
char *title;
char *author;
char *publisher;
int year;
char *language;
int pages;
float price;
};
int reglen( struct Book * );
int readData( struct Book * );
void writeRegister(FILE *fp, struct Book *myBook)
{ //writes in actual file position
char c = '|';
int sizeRegWrite = reglen(myBook); //reglen() returns the size of Book
fwrite(&sizeRegWrite, sizeof(int), 1, fp);
fwrite(myBook->title, sizeof(char), strlen(myBook->title), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->author, sizeof(char), strlen(myBook->author), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->publisher, sizeof(char), strlen(myBook->publisher), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->year), sizeof(int), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(myBook->language, sizeof(char), strlen(myBook->language), fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->pages), sizeof(int), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
fwrite(&(myBook->price), sizeof(float), 1, fp);
fwrite(&c, sizeof(char), 1, fp); //writing delimiter
return;
} // end function: writeRegister
int main( void )
{
FILE *fp = fopen("BD_books2.bin", "rb");
if(fp == NULL)
{
perror( "fopen for BD_books2.bin failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
struct Book myBook;
int goodRead = readData(&myBook); //Reads all fields from keyboard and places in Book. Working properly
if( goodRead )
{
writeRegister(fp, &myBook);
}
system("pause");
return 0;
} // end function: main