【发布时间】:2017-09-25 16:59:49
【问题描述】:
我正在尝试从 C 中的文件中读取此文本。假设这是文件 Input.txt
This is a description which can be up to 1024 characters long
First
Second
Thrid Option This is a description for third
Fourth
我要读First、Second、Third、Fourth这4个字,剩下的就是丢弃。我有这个问题的解决方案,但我不明白它为什么起作用:
char string[1024];
char words[4][256];
FILE *in = fopen("Input.txt", "r");
// Catch first line
fgets(string, 1024, in);
for(int i = 0; i < 4; i++){
fscanf(in, "%255s[^\n]\n", words[i]);
fscanf(in, "%*[^\n]\n");
}
输入文件应为特殊格式。
- 第一行是描述,最长可达 1024 个字符。
- 第 2 到 5 行始终采用以下格式:“Word tab Option tab Description ”。 Word 是必需的,Option 和 Description 是可选的(例如,参见 Input.txt)
如果您能解释一下格式字符串的不同组成部分、它们的工作原理以及整个解决方案的工作原理,我将不胜感激。
(我也找不到任何关于 fscanf 格式如何工作的具体信息,如果有人可以给我一个参考,我会很高兴)
【问题讨论】:
-
"%255s[^\n]\n"在"%255s"之后查找[。奇怪的代码。 -
fgets()的效果会在第一行正好是其最大 1024 个字符(或者更长)时让您感到惊讶。 -
@chux 我认为
%255s[^\n]会读取所有字符,但不会读取\n,因为^ -
我也愿意寻求更好的解决方案(最好有解释)
-
不,@Codey。
%255s跳过前导空白,然后将最多 255 个非空白字符读取到提供的数组中。之后[^\n],指示scanf读取和使用文字字符[和^、任意运行的空格和文字字符]。通常,尝试读取第一个[将导致匹配失败。您的意思可能是%255s%*[^\n]%*c,它更好,但可能不如使用fgets()读取整行。
标签: c format scanf format-string