如何在扫描文本文件时跳过一行?

17

我想扫描一个文件并在读取之前跳过一行文本。 我尝试了:

fscanf(pointer,"\n",&(*struct).test[i][j]);

但是这个语法只是从第一行开始执行。

4个回答

54

我能够通过以下指令在scanf中跳过行:

fscanf(config_file, "%*[^\n]\n");

格式字符串匹配包括空格在内的任何字符所在的行。格式字符串中的*表示我们不关心保存该行,而只是增加文件位置。

格式字符串解释:
%是每个scanf格式字符串开始的字符;
*表示不将找到的模式放在任何地方(通常您将找到的模式保存到格式字符串后的参数中,在这种情况下,参数为NULL);
[^\n]表示除换行符以外的任何字符;
\n表示换行符;

所以[^\n]\n表示一个以换行符结尾的完整文本行。

参考此处


2
'\n'是空格,它表示会消耗任意数量的任何空格,不仅仅是单个换行符。 - hyde
还应该提到的是,fscanf的实现方式是将整行读入内存,然后释放它。 - Jakub Nowak
为什么不直接使用 "%*\n" 呢? - user97662

16

fgets函数会获取一行文本,并将文件指针定位到下一行开头。随后,你可以从第二行开始读取你需要的内容。

char buffer[100];
fgets(buffer, 100, pointer);

只要你的第一行少于100个字符,它就可以工作。否则,你必须进行检查和循环。


14

不清楚你是想将数据存储在何处,因此很难猜出答案,不过你可以跳过字节,直到遇到一个\n

FILE *in = fopen("file.txt", "r");

你可以使用fgets跳过整行,但这种方法不安全(因为你需要预估该行的长度),否则你可以使用fgetc:

char c;
do {
  c = fgetc(in);
} while (c != '\n');

最后,在你的fscanf中应该有格式说明符,以实际解析数据,例如:

fscanf(in, "%f", floatVariable);

您可以在此处查看说明符。


4

此处可使用 fgets 函数。

#define MAX_LINE_LENGTH 80

char buf[MAX_LINE_LENGTH];

/* skip the first line (pFile is the pointer to your file handle): */
fgets(buf, MAX_LINE_LENGTH, pFile);

/* now you can read the rest of your formatted lines */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接