- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 C 语言的文件处理非常陌生,我想问几个问题!
特别是,我不确定 fscanf() 和 fgets() 是否会自动逐行递增文件指针。根据我对测试和文档的了解,fscanf() 一次仅将文件指针移动 1 个字符/类型;但 fgets() 似乎是逐行读取文件(因为它在遇到换行符时终止)。从文档来看,fscanf() 将忽略任何空白字符。那么这是否意味着即使我有一个逐行输入文件,fscanf 将无法逐行读取它?即使我指定了确切的格式,换行符也不会被保留?
特别是,如果一行包含 10 个非空白部分(单词、整数、 double 等),但我只指定其中 3 个读取到变量中(使用 %* 或干脆不输入任何内容),这些读取函数会做什么?
例如,我的输入文件如下所示:
9 opls_182 9 DNP CT 9 0.140 12.0110
10 opls_182 10 DNP CT 10 0.140 12.0110
11 opls_145 11 DNP CA 11 -0.115 12.0110
12 opls_145 12 DNP CA 12 -0.115 12.0110
我只想阅读 opls_182 和 CT 以及第 9 部分(第 2、第 5 和第 6 列)。使用 fgets() 和 sscanf(),我会这样写:
fgets(fp,500,buffer);
sscanf(buffer, "%*s %s %*d %*s %s %d %*f %*f", variables);
or this:
sscanf(buffer, "%*s %s %*d %*s %s %d %*s", variables);
or this:
sscanf(buffer, "%*s %s %*d %*s %s %d", variables);
这三个函数的工作方式相同吗?那么在第二个版本中,最后一个 %*s 会解析整个最后两列,还是只是解析倒数第二列? (%s 似乎是从非空白字符开始到非空白字符)。
如果我的说明符多于每行中的部分怎么办?会出现错误或者额外的变量只是保持 0/空吗?
如果我使用 fscanf(),只有第一个版本可以正常工作,第二个和第三个版本会搞乱读取,因为 fscanf() 不会自动跳线,对吧?
scanf 函数中的所有格式说明符都将忽略空白字符。但是,如果我想跳过第一部分([ bond ])并读取最后一个整数,有什么方法可以执行类似 %*some_format %d 的操作(忽略直到找到整数)? %[^format] 有效吗?我尝试了 %[^%d] 或 %[^d],两者都只会停在字符“d”处并给出“[ bon”。我知道您可以使用 %[^] 指定要排除的字符数,但是,如果该数字在整个文件中发生变化,则无法使用此方法。
我发现C语言的读/写功能非常强大,但要正确使用也很困难。非常感谢你们!
最佳答案
规则非常简单:fgets()
读取整行,除非该行的长度超过提供的缓冲区,在这种情况下它会读取尽可能多的内容。另一方面,fscanf()
会读取您告诉它的内容,并跳过前面的空格。例如,给定一行 "1 2 3"
(不带引号),fgets()
将读取整行,而 fscanf(fp, "%d %d", &i1, &i2)
将读取两个整数并将它们存储到提供的地址,并保留 "3"
(注意包括空格)不读取。
在第二次 sscanf()
调用中,最后一个 %*s
仅解析倒数第二列。如果您想跳过所有内容直到行尾,请使用类似 %*[^\n]
的内容。您是正确的,如果您使用 fscanf
,只有第一个版本可以执行您想要的操作,因为 fscanf()
将换行符视为另一个空格。不过,您可以使用 %*[^\n]
格式说明符修复 fscanf()
版本。
scanf
无法“搜索”输入,它必须始终根据指定的格式对其进行解析。没有与 .*
正则表达式等效的格式。
您的 scanf
调用不会执行您想要的操作,因为 %s
的第一个实例将吃掉剩余的字符串,因此只会处理两个格式字符。但是,如果您将 %s
替换为 %[^0-9]
,它将完全按照您的要求执行(对于此输入)。
关于c++ - 读取文件: How file pointer is moved using fscanf and how scanf/fscanf work with missing %type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523431/
我正在用 C 编写一个函数,它应该从文件中输入有关学生及其成绩的信息。但是,有时在运行程序时,即使输出符合预期,测试也会在 fscanf 处显示分析器错误。 /*structure for grade
如何在 fscanf() 中跳过一个值并转到下一个值?例如,我的输入文件中有以下数据: 11112222 3.95 4 22.5 我应该怎么做才能扫描第二个值? (我想跳过11112222扫描3.95
我正在使用这个 for 循环从纬度和经度坐标文件中引入数据,然后将坐标转换为十进制度数,将度数转换为弧度,然后计算分离角度,并返回两个城市之间的距离。我需要比较文件的前两行,计算距离,打印结果,然后再
我在 while(fscanf != EOF) 循环中执行了一些代码。但是,即使 fscanf 已完成执行,我也需要继续运行该代码,直到满足某些条件。我的意思是我想我可以将代码复制/粘贴到 while
我对 C 语言的文件处理非常陌生,我想问几个问题! 我经常使用 fscanf/fget 将文件转换为不同的格式。不过我不太清楚 fscanf 和 fgets 之间的区别。 特别是,我不确定 fscan
我是 C 的新手,这里有这个简单的代码: int main(int argc, char **argv){ FILE *input = stdin; char string[20];
我已经有了一些使用 fscanf() 读取文本文件的代码,现在我需要修改它,以便以前无空格的字段需要允许空格。文本文件基本上是这样的形式: title: DATA title: DATA etc...
我目前正在开发一个简单的 C 应用程序。它采用单个文件作为命令行参数,其格式如下: 1,2,3 4,5,6 7,8,9 etc. 但是,无论出于何种原因,fscanf 都不会扫描数字!这是一个例子:
我正在尝试读取逗号分隔值格式的文件,程序读取了前两种数据类型,但无法读取最后一种。请帮我一些忙 这是我正在尝试读取的文件中的内容: Jane,50,400.60 代码如下: FILE* fpt
我试图让我的程序从文件中读取输入,但不跳过 fscanf 通常执行的空行。扫描文件的文件和循环是: inFile = fopen("text.txt", "r"); for(i = 0; fsca
我正在尝试从 C 文件中读取数据,该文件将始终以以下类型的行进行格式化: 16 Oct 2013 00:01:00.000,0.000,0.000000 这是一个字符串、一个逗号、一个浮点数、一个逗号
如何格式化 fscanf 来格式化输入{'name surname', 'username', 指向不包含撇号的字符串 fscanf(fp,"{%s %s %d}",name,username,use
我正在尝试使用 fscanf 将文件中的行读取到指向字符数组的指针中。我在打印时遇到段错误。我究竟做错了什么?我应该使用 fscanf 以外的函数吗? #include #include #inc
我有一个制表符分隔文件,我正在尝试将其转换为制表符分隔文件。我正在使用 C。我在尝试读取文件的第二行时遇到了困难。现在我只有数万行重复第一行。 #include #include #define
我正在尝试使用 c 读取一个文件,其中每个变量都由竖线字符分隔。我尝试了以下 fscanf(fp, "%s[|], %s[|], \n", str1, str2); 括号之间的字符是垂直线:竖线字符。
我真的卡在某事上了。 我有一个文本文件,其中有 1 个单词后跟 ~100 个 float 。 float 由空格、制表符或换行符分隔。这种格式在整个文本文件中重复多次。 例如,这是文本文件的样子: o
我想使用 fscanf (使用 gcc 的 C 代码)从文件中解析 ip。所以,我想做: char myip[INET_ADDRSTRLEN]; fscanf(file, "%16s", myip);
while 循环不起作用,我不明白为什么。它没有给我任何错误,但它没有读取任何输入内容。文件内容为: 4 $11$ pelle $2$ pollo $333$ palla $41$ alla 我的代码
我有一些代码,我试图从文件中读取一个集团实例。实例文件中的第一行和第二行分别表示顶点和边的数量。但是我的代码似乎没有正确阅读。这是我的代码中与问题相关的部分: int num_edges=0; int
我正在尝试使用 fscanf 解析一个文本 (CSS) 文件并提取所有匹配此模式的语句: @import "some/file/somewhere.css"; 为此,我设置了以下循环: FILE *f
我是一名优秀的程序员,十分优秀!