我正在制作一个名为“图书管理器”的程序,现在需要的是创建从文件保存和加载图书(结构)的函数。我想知道如何阅读它们。 这是我的结构定义:
typedef
struct book {
char * title;
char * authorName;
char * authorSurname;
int releaseYear;
char * genre;
int flags[10];
} Book;
我制作了一个函数,允许我从文件中读取一本书,但这很糟糕,而且我不知道如何读取一组书籍。 我想将其读入我的数组。
Book allBooks[LIBRARY_SIZE];
我想从外观中读取的示例文件:
Christine,Stephen,King,1980,Horror
Harry Potter,J.K,Rowling,2000,Fantasy
有什么想法吗?
编辑:这就是我尝试阅读简单书籍的方法(一开始教授说这就足够了)阅读本文时不要自杀。
void loadBook(Book * book, FILE * plik){
char jakasTablica[50];
char jakasTablica2[50];
char jakasTablica3[50];
char jakasTablica4[50];
int i = 0;
char znak;
fscanf(plik,"%c",&znak);
while(znak != ','){
jakasTablica[i] = znak;
i += 1;
fscanf(plik,"%c",&znak);
}
jakasTablica[i] = '\0';
strcpy(book->title, jakasTablica);
i = 0;
fscanf(plik,"%c",&znak);
while(znak != ','){
jakasTablica2[i] = znak;
i += 1;
fscanf(plik,"%c",&znak);
}
jakasTablica2[i] = '\0';
strcpy(book->authorName, jakasTablica2);
i = 0;
fscanf(plik,"%c",&znak);
while(znak != ','){
jakasTablica3[i] = znak;
i += 1;
fscanf(plik,"%c",&znak);
}
jakasTablica3[i] = '\0';
strcpy(book->authorSurname, jakasTablica3);
i = 0;
fscanf(plik,"%c",&znak);
while(znak != ','){
jakasTablica4[i] = znak;
i += 1;
fscanf(plik,"%c",&znak);
}
jakasTablica4[i] = '\0';
strcpy(book->genre, jakasTablica4);
i = 0;
int zmienna = 0;
fscanf(plik, "%d", &zmienna);
book->releaseYear = zmienna;
}
最佳答案
要回答如何阅读每个逗号分隔的行,您需要执行以下操作:
#include <stdio.h>
#include <string.h>
int main (void)
{
FILE *fp;
char a[30], b[30], c[30], d[30], e[30];
char line[100];
fp=fopen("./data.txt", "r");
fgets( line, sizeof(line), fp );
sscanf( line, "%29[^,],%29[^,],%29[^,],%29[^,],%29[^,]", a,b,c,d,e );
printf( "%s %s %s %s %s\n", a,b,c,d,e);
fclose( fp );
return( 0 );
}
这只会读取一行,但您可以将其放入循环中并根据需要一次处理一行数据。这可能不是最快的方法,但只要您知道每行的格式,它就非常简单。
如果书名中带有 ,
呢?也许你最好使用 CSV parsing library. 如果你使用像这样的库,你必须在任何包含 ,
的字段周围放置 "
'将其写入文本文件,以便 CSV 解析器可以处理它。
您可以直接使用 fread()/fwrite() 结构来使用二进制文件 I/O。您将必须使用固定大小的结构。下面是一个简单的例子。它不会执行所有所需的错误检查,但应该足以让您入门。
#include <stdio.h>
#include <string.h>
typedef struct
{
char title[60];
char author[20];
int year_published;
int pages;
}Book;
int main (void)
{
FILE *fp;
Book b1,b2;
Book book;
strcpy( b1.title, "Title Book 1" );
strcpy( b1.author, "Book 1 Author" );
b1.year_published = 1991;
b1.pages = 123;
strcpy( b2.title, "Title Book 2" );
strcpy( b2.author, "Book 2 Author" );
b2.year_published = 1992;
b2.pages = 456;
fp=fopen("./books.dat", "w+");
if( fp )
{
fwrite( &b1, sizeof( b1 ), 1, fp );
fwrite( &b2, sizeof( b2 ), 1, fp );
fclose( fp );
printf( "Wrote file\n" );
printf( "Now reopen the file and read the structs\n" );
fp = fopen( "./books.dat", "r" );
if( fp )
{
fread( &book, sizeof(book), 1, fp );
printf("%s %s %d %d\n", book.title, book.author, book.year_published, book.pages);
fread( &book, sizeof(book), 1, fp );
printf("%s %s %d %d\n", book.title, book.author, book.year_published, book.pages);
fclose( fp );
}
else
{
printf(" Failed to open created data file.\n");
}
}
else
{
printf( "Failed to open file\n" );
}
return 0;
}
关于c - 如何从c中的文件中读取结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771212/