Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 扫描和扫描文件中的数据时出现问题_C_Scanf - Fatal编程技术网

C 扫描和扫描文件中的数据时出现问题

C 扫描和扫描文件中的数据时出现问题,c,scanf,C,Scanf,我在从文件中提取数据时遇到了一些问题,我不明白哪里出了问题,它对一位数的整数很有效,但是当输入是两位数时,它不会扫描整数。其他一切都在起作用 假设输入为: abc de,1,2,y 那么输出是: “abc de”12年 但是当输入是 cde abc,21.31,y 扫描在%d上失败: fin1 = fscanf(fp1, "%20[^,]%*c%d %*c %d%*c %c%*c", name1, &code1, &season, &relevant); 帮忙就好了

我在从文件中提取数据时遇到了一些问题,我不明白哪里出了问题,它对一位数的整数很有效,但是当输入是两位数时,它不会扫描整数。其他一切都在起作用

假设输入为:

abc de,1,2,y
那么输出是:

“abc de”12年 但是当输入是

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
代码

文件*fp1,*fserie;
char file1name[256],name1[21],relevant=0,active=0;
整数代码1,季节,fin=0,
而(1){
放置(“输入第一个文件名:”);
scanf(“%s”,file1name);
如果(!(fp1=fopen(file1name,“r”))
{
printf(“打开文件%s时出错!!!\n”,file1name);
继续;
}否则就断了;
}
如果(!(fserie=fopen(“series.txt”,“w”))
{
fclose(fp1);
出口(1);
}
做
{
fin1=fscanf(fp1,“%20[^,]%*c%d%*c%d%*c%c%*c”,名称1、代码1、季节和活动1);
如果(相关=='y')
fprintf(fserie,“%s,%d,%d\n”,名称1,代码1,季节);
}while(fin1!=EOF&&fin2!=EOF);

您遇到的问题是您的格式字符串以及未能针对每次迭代的所有4次成功转换验证读取。对于格式字符串,您可以使用:

" %20[^,],%d,%d,%c|"
(前导空格是可选的,但如果在下一个名称之前的
'.
后面有空格,则前导空格是必需的。另外请注意,如果最后一个
活动的
字符周围可能有空格,则可以通过在格式字符串中包含空格来使用任何和所有空格,例如
%20[^,],%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);
}
示例使用/输出

$ ./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

仔细检查一下,如果你还有其他问题,请告诉我。有不止一种方法可以做到这一点,但这是最接近你的原始数据。

请展示一些样本数据。宇宙,2,3,Y动物园,7,3,N霍比特人,10,2,Y真实谎言,12,25,N动物,22,2,Y欣快,35,5,Y…把它放在你可以格式化它的问题中,我得到前2个(宇宙,2,3,Y动物园,7,3,N)但在那之后,它进入了hellIs文本文件中的数据真正的
“宇宙,2,3,Y |动物园,7,3,N |霍比特人,10,2,Y |真实的谎言,12,25,N |动物,22,2,Y |欣快,35,5,Y”
,捕获并更改
:)
这与我所拥有的几乎相同,即使我更改为它也不起作用,这让我发疯,因为没有理由发生这种情况。你是如何创建数据文件的?它是在Win10上用UTF-16字符集创建的吗?这将导致各种问题,除非您切换到使用宽字符类型。你使用的是什么操作系统?我的问题是什么时候输入是霍比特人,10,2,Y(或者其他任何一个比windows 10上的第二次扫描失败更大的1),我不确定文件发送给我的数据我该怎么检查
$ ./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