这个格式说明符在C中是什么意思?

这个格式说明符在C中是什么意思?,c,file-handling,C,File Handling,我有一个这样的代码片段 while( fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)!=EOF) 读取的格式字符串部分 特别是这一部分 匹配字符集中的非空字符序列。如果 集合的第一个字符是^,然后是不在集合中的所有字符 一套是匹配的 因此,该格式说明符匹配所有字符,除了,字符(格式字符串中的字符随后匹配)。所以,如果你有一个像 typedef struc

我有一个这样的代码片段

while( fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)!=EOF)

读取的格式字符串部分

特别是这一部分

匹配字符集中的非空字符序列。如果 集合的第一个字符是^,然后是不在集合中的所有字符 一套是匹配的

因此,该格式说明符匹配所有字符,除了
字符(格式字符串中的字符随后匹配)。所以,如果你有一个像

typedef struct Book_t {
    char type;
    char title[100];
    char author[100];
    float price;
}Book ;
然后有一个在模式中包含数据的文件:

BookType,BookTitle,BookAuthor,BookPrice
然后有一次,你可以把每一行读进
book
as

fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)
对于文件的一行,如下所示:

A,old man and the sea,ernest hemingway,12.5
A
将被读入
book。键入
,然后读取所有与逗号不匹配的字符,这样将一直读入
sea
,并停止,因为下一个字符是
。此
将与格式字符串中的
匹配。对于author字段,将重复相同的过程

请注意,读取未指定数量的字符直到匹配在逗号之前停止是不好的,因为它读取的缓冲区通常是固定长度的。这就是为什么这样做时最好指定最大宽度(考虑空字符)。继续上面的例子,这看起来像

fscanf(b,"%c,%99[^,],%99[^,],%f",&book.type,book.title,book.author,&book.price)

让99表示它最多只能匹配99个字符,以避免任何缓冲区溢出,因为缓冲区
title
最多只能容纳100个字符,并且
\0
字符至少需要一个字节。

表示它读取字符串,但遇到
时停止,
字符。然后使用后面的逗号匹配并读取停止它的逗号。否则,下一个
%[^,]
%f
将暂停。