C fscanf复杂格式

时间:2017-09-25 16:59:49

标签: c format scanf format-string

我正在尝试从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个字 First Second Third Fourth ,其余的将是丢弃。我有这个问题的解决方案,但我不明白为什么它的工作原理:

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行始终采用以下格式:&#34; Word 标签 选项 标签 < em>描述&#34;。 Word是必需的,Option和Description是可选的(例如,参见Input.txt)

我非常感谢格式字符串的不同组件的解释,它们的工作原理以及整个解决方案的工作原理。

(我也无法找到有关fscanf格式如何工作的任何具体信息,如果有人可以给我参考,会很高兴)

1 个答案:

答案 0 :(得分:2)

“以及整个解决方案的工作原理”IMO,在一般情况下,它没有。

2 '\n'格式中的第二个fscanf(in, ...使这成为一个弱解决方案。 '\n'将扫描任意数量的换行符以及任何空白区域。最好继续使用fgets(string, ...)然后sscanf(string, ...)

"%255s[^\n]\n"[之后查找"%255s"。奇怪的代码。 @John Bollinger

相反

char string[1024+1+1];  // increase for the \n and the \0
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] = '\0'; // If line was all white-sapce
    }
    puts(words[i]);
}