C fscanf 复杂格式
C fscanf complex format
我正在尝试从 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
我想读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 选项卡 描述”。 Word 是必需的,Option 和 Description 是可选的(参见 Input.txt 例如)
如果能解释格式字符串的不同组成部分、它们的工作原理以及整个解决方案为何有效,我将不胜感激。
(我也没有找到关于fscanf格式如何工作的任何具体信息,如果有人能给我参考,我会很高兴)
"and why this whole solution works" IMO,在一般情况下,它不会。
2 fscanf(in, ...
格式中的第二个 '\n'
使它成为一个弱解决方案。 '\n'
将扫描任意数量的换行符以及任何白色 space。最好继续使用 fgets(string, ...)
然后 sscanf(string, ...)
"%255s[^\n]\n"
在 "%255s"
之后查找 [
。奇怪的代码。
相反
char string[1024+1+1]; // increase for the \n and the [=10=]
char words[4][256];
FILE *in = fopen("Input.txt", "r");
// Catch first line
// fgets(string, 1024, in);
fgets(string, sizeof string, in);
// "%255s"
// scan over yet do not save leading white-space
// scan and save up to 255 non-white-space characters.
// Append a null character to form a string
for(int i = 0; i < 4 && fgets(string, sizeof string, in); i++ ){
if (sscanf(string, "%255s", words[i]) != 1) {
words[i][0] = '[=10=]'; // If line was all white-sapce
}
puts(words[i]);
}
我正在尝试从 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
我想读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 选项卡 描述”。 Word 是必需的,Option 和 Description 是可选的(参见 Input.txt 例如)
如果能解释格式字符串的不同组成部分、它们的工作原理以及整个解决方案为何有效,我将不胜感激。
(我也没有找到关于fscanf格式如何工作的任何具体信息,如果有人能给我参考,我会很高兴)
"and why this whole solution works" IMO,在一般情况下,它不会。
2 fscanf(in, ...
格式中的第二个 '\n'
使它成为一个弱解决方案。 '\n'
将扫描任意数量的换行符以及任何白色 space。最好继续使用 fgets(string, ...)
然后 sscanf(string, ...)
"%255s[^\n]\n"
在 "%255s"
之后查找 [
。奇怪的代码。
相反
char string[1024+1+1]; // increase for the \n and the [=10=]
char words[4][256];
FILE *in = fopen("Input.txt", "r");
// Catch first line
// fgets(string, 1024, in);
fgets(string, sizeof string, in);
// "%255s"
// scan over yet do not save leading white-space
// scan and save up to 255 non-white-space characters.
// Append a null character to form a string
for(int i = 0; i < 4 && fgets(string, sizeof string, in); i++ ){
if (sscanf(string, "%255s", words[i]) != 1) {
words[i][0] = '[=10=]'; // If line was all white-sapce
}
puts(words[i]);
}