c - 问题扫描和扫描文件中的数据
问题描述
我在从文件中提取数据时遇到了一些麻烦,我不明白出了什么问题,它适用于个位数整数,但是当输入是两位数时,它不会扫描整数。其他一切都在工作。
假设输入是:
abc de,1,2,y
那么输出是:
"abc de" 1 2 y 但是当输入是
cde abc,21.31,y
扫描失败%d
:
fin1 = fscanf(fp1, "%20[^,]%*c%d %*c %d%*c %c%*c", name1, &code1, &season, &relevant);
帮助会很好。还有一些你问的输入:
输入:
The Universe,2,3,Y|Zoo,7,3,N|The Hobbit,10,2,Y|True Lies,12,25,N|Animals,22,2,Y| Euphoria,35,5,Y
代码:
FILE *fp1, *fserie;
char file1name[256], name1[21], relevant = 0, active = 0;
int code1, seasons, fin = 0,
while (1) {
puts("Enter First File Name:");
scanf("%s", file1name);
if (!(fp1 = fopen(file1name, "r")))
{
printf("error in opening file %s !!!\n", file1name);
continue;
} else break;
}
if (!(fserie = fopen("series.txt", "w")))
{
fclose(fp1);
exit(1);
}
do
{
fin1 = fscanf(fp1,"%20[^,]%*c %d%*c %d%*c %c%*c", name1, &code1, &season, &active1);
if (relevant == 'y')
fprintf(fserie,"%s,%d,%d\n", name1, code1, season);
} while (fin1 != EOF && fin2 != EOF);
解决方案
您遇到的问题是您的格式字符串以及您未能针对每次迭代的所有 4 次成功转换验证读取。对于您的格式字符串,您可以使用:
" %20[^,],%d,%d,%c|"
(前导空格是可选的,但如果您'|'
在下一个名称之前有空格,则需要。另请注意,如果您有可能在最后一个字符周围有空格active
,您可以通过在格式字符串中包含空格来处理任何- 以及所有空格,例如" %20[^,],%d,%d, %c |"
)
读取具有多组电影信息的行的示例可能是:
#include <stdio.h>
#define MAXN 21 /* if you need a constant, #define one (or more) */
int main (int argc, char **argv) {
char name[MAXN], active;
int code, seasons;
/* 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 (fscanf (fp, " %20[^,],%d,%d,%c|",
name, &code, &seasons, &active) == 4) {
printf ("\nname : %s\ncode : %d\nseason : %d\nactive : %c\n",
name, code, seasons, active);
}
if (fp != stdin) /* close file if not stdin */
fclose (fp);
}
示例输入文件
$ cat dat/movies.txt
The Universe,2,3,Y|Zoo,7,3,N|The Hobbit,10,2,Y|True Lies,12,25,N|Animals,22,2,Y| Euphoria,35,5,Y
示例使用/输出
$ ./bin/readmovies dat/movies.txt
name : The Universe
code : 2
season : 3
active : Y
name : Zoo
code : 7
season : 3
active : N
name : The Hobbit
code : 10
season : 2
active : Y
name : True Lies
code : 12
season : 25
active : N
name : Animals
code : 22
season : 2
active : Y
name : Euphoria
code : 35
season : 5
active : Y
如果您还有其他问题,请仔细查看并告诉我。有不止一种方法可以做到这一点,但这是最接近您的原始方法。
推荐阅读
- angular - 在 Angular 中创建隐藏在后端响应中的自定义错误
- c - 使用 gcc 编译 C 程序
- delphi - 使用 CGI 运行 Delphi 应用程序并将结果发送到前端
- r - 将一些函数应用于列表中的数据框列
- routes - 赛普拉斯 URL 匹配查询
- javascript - 如何在 $('input[name="website"]').val(window.location.href).change(); 之前添加分号
- python - 如何更改熊猫日期时间列中的日期?
- ssl - 使用 SSL 的 ADFIND 连接
- sql - 使用 SQL 表结构进行评分
- javascript - 302重定向后,浏览器在隐式Oauth2认证后重定向到错误的位置,并且访问令牌片段丢失