- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从一个文件中读入,该文件包含 15 个由“|”分隔的特征象征。我正在使用: while(fscanf(file, "%*d|%s|%*s|%s|%*d|%*s|%*d|%*s|%*s|%* f|%*f|%*s|%*s|%*f|%*f", &name, &state)==2)
但是当我在上面运行 gdb 时,我意识到它从未真正进入循环。我使用 %*d/s
因为它告诉 fscanf
跳过这些值,正确吗?我只想从输入中读取整行的 2 个值,即开头附近的两个 %s。关于如何修复有什么建议吗?抱歉,格式不理想。
最佳答案
如果您仍然遇到困难,一个简短的示例可能会有所帮助。查看您尝试的格式字符串,例如
"%*d|%s|%*s|%s|%*d|%*s|%*d|%*s|%*s|%*f|%*f|%*s|%*s|%*f|%*f"
您似乎想要将第二个和第四个字段保存为 name
和 state
中的字符串值。
我立即怀疑您使用 &name, &state
是不正确的,因为假设您已将 name
和 state
声明为足够大小的字符数组为了保存第二个和第四个字段中的数据, name
和 state
已经是指针(参见: C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) ),因此不需要 ' &'
位于变量名称之前。如果它们没有声明为字符数组(或指向数组的指针并分配足够的内存),则您的解析将由于类型不兼容而失败。
接下来,为什么使用 fgets()
或 POSIX getline()
读取整行,然后使用 sscanf()
进行解析如此重要code> 而不是使用 fscanf()
:
因此,您不必担心 15 个字段的正确匹配,而只需担心 4 个字段 - 您不必关心第 4 个字段之后的行的其余部分。
将一个小示例与随机生成的数据放在一起(根据数据需要调整缓冲区大小),您可以执行如下操作将第二个和第四个字段解析为字符串:
#include <stdio.h>
#include <string.h>
#define FLDW 32 /* max field width */
#define MAXC 1024 /* max chars in line */
int main (int argc, char **argv) {
char buf[MAXC], /* line buffer */
name[FLDW], /* storage for name */
state[FLDW]; /* storage for state */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line of input */
/* parse 2nd & 4th fields as strings - you don't care about rest */
if (sscanf (buf, "%*d|%31[^|]|%*[^|]|%31[^|]", name, state) == 2) {
buf[strcspn (buf, "\n")] = 0; /* trim \n from buf */
/* output line with parsed name and state to right */
printf ("%s => name: %s, state: %s\n", buf, name, state);
}
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
(注意:使用field-width修饰符来保护name
和state
的数组边界> 与 %31[^|]
。使用 strcspn
只是从 末尾删除
因此 '\n'
bufname
和 state
值将在输出 buf
之后打印在同一行。如果您不打印 buf
,那么您根本不需要该调用来进行解析)
示例使用/输出
生成的最小数据与您的格式字符串匹配。解析第二个和第四个值将在 name
和 state
中产生所需的字符串,例如
$ ./bin/fgetssscanf dat/field15pipes.txt
01|8a|0b|6c|82|1d|33|5e|4f|7.|0.|4g|3h|7.|5. => name: 8a, state: 6c
01|9a|5b|0c|42|1d|93|3e|9f|8.|0.|5g|4h|6.|5. => name: 9a, state: 0c
01|4a|5b|7c|22|0d|23|1e|1f|7.|2.|1g|5h|7.|7. => name: 4a, state: 7c
01|8a|2b|5c|72|1d|53|6e|2f|1.|1.|8g|0h|7.|6. => name: 8a, state: 5c
11|4a|6b|5c|92|2d|73|0e|6f|4.|2.|2g|7h|2.|4. => name: 4a, state: 5c
01|2a|6b|0c|02|1d|83|0e|2f|5.|2.|9g|4h|3.|8. => name: 2a, state: 0c
31|1a|0b|0c|72|2d|13|3e|3f|9.|0.|2g|5h|6.|9. => name: 1a, state: 0c
01|8a|3b|7c|92|1d|93|3e|9f|6.|1.|4g|4h|8.|3. => name: 8a, state: 7c
11|1a|4b|7c|42|2d|73|0e|5f|7.|0.|0g|5h|1.|7. => name: 1a, state: 7c
21|8a|6b|9c|22|2d|23|2e|1f|9.|0.|1g|6h|6.|8. => name: 8a, state: 9c
仔细检查一下,如果有疑问请告诉我。
关于c - 使用 fscanf 从输入文件中逐行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55822355/
我正在用 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
我是一名优秀的程序员,十分优秀!