c - 如何从c中的文件中读取结构?

标签 c file struct scanf

我正在制作一个名为“图书管理器”的程序,现在需要的是创建从文件保存和加载图书(结构)的函数。我想知道如何阅读它们。 这是我的结构定义:

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/

相关文章:

c++ - 将临时结构作为模板参数传递

c - 如何遍历这个由多个结构体、数组和指针组成的 C 数据结构?

c# - Linq 根据目录名称 C# 按升序获取文件列表

python - 使用 swig 连接 C 和 Python

c - 将文本文件的每一行存储到数组中

java - 将数据记录到文件服务器上的文件还是更好地使用 MySQL?

c++ - 在 C++ 中使用 #define 定义位标志

c - 为什么我不能用两个具有相同内容的结构互换分配?

c - c 中的字符串指针在用 * 写入时不起作用

c - 我想知道在 Linux 中使用 fork() 创建子进程的两种方式有什么不同?