【发布时间】:2010-09-25 00:09:13
【问题描述】:
我正在使用 fscanf 解析一个文本 (css) 文件。基本目标很简单;我想抽出任何符合这个模式的东西:
@import "some/file/somewhere.css";
所以我使用 fscanf,告诉它读取并丢弃直到 '@' 字符的所有内容,然后存储所有内容直到它达到 ';'特点。这是执行此操作的函数:
char* readDelimitedSectionAsChar(FILE *file)
{
char buffer[4096];
int charsRead;
do
{
fscanf(file, "%*[^@] %[^;]", buffer, &charsRead);
} while(charsRead == 4095);
char *ptr = buffer;
return ptr;
}
据我所知,我已经创建了一个可以容纳 4095 个字符的缓冲区。但是,我发现事实并非如此。如果我有一个文件包含一个很长的匹配字符串,如下所示:
@import "some/really/really/really/long/file/path/to/a/file";
使用 char[4096] 缓冲区将其截断为 31 个字符。 (如果我用printf检查buffer的值,我发现字符串被剪短了。)
如果我增加缓冲区大小,则会包含更多字符串。我的印象是一个字符占用一个字节(尽管我知道这会受到编码的影响)。我试图了解这里发生了什么。
理想情况下,我希望能够将缓冲区设置为“即时”所需的大小——也就是说,让 fscanf 创建一个足够大的缓冲区来存储字符串。这可以做到吗? (我知道 GNU 的 %as 标志,但这是一个适用于 OS 10.5/10.6 的 Mac 应用程序,我不确定它是否可以在这个平台上运行。)
【问题讨论】: