阅读fscanf的格式字符串部分
特别是这部分
匹配字符集中的非空字符序列。如果
集合的第一个字符是 ^,然后所有字符不在
集合是匹配的。
因此,该格式说明符匹配除 , 字符(在您的格式字符串中随后匹配)之外的所有字符。所以,如果你有一个像
这样的结构
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.type,然后所有与逗号匹配的字符 not 都将被读取,因此将一直读入到sea 并停止,因为下一个字符是@ 987654334@。此, 将与格式字符串中的, 匹配。对作者字段重复相同的过程。
请注意,读取未指定数量的字符直到匹配在逗号之前停止是一个坏主意,因为它正在读取的缓冲区通常是固定长度的。这就是为什么最好在这样做时指定最大宽度(考虑空字符)。继续上面的例子,这看起来像
fscanf(b,"%c,%99[^,],%99[^,],%f",&book.type,book.title,book.author,&book.price)
99 表示它最多只能匹配 99 个字符以避免任何缓冲区溢出,因为缓冲区 title 最多只能容纳 100 个字符,而 \0 字符至少需要一个字节.