如何使用fscanf读取带分隔符的文件?

如何使用fscanf读取带分隔符的文件?,c,file,scanf,delimiter,C,File,Scanf,Delimiter,我正在尝试读取文件并将信息存储到以下缓冲区 char bookCode[MAX]; char title [MAX]; char author [MAX]; char year [MAX]; float selfCost; float selfPrice; 我的文件数据如下所示 1738|Jane Eyre|Charlotte Bronte|1997|2.5|4.09 2743|The Kite Runner|Khaled Hosseini|20

我正在尝试读取文件并将信息存储到以下缓冲区

    char bookCode[MAX];
    char title [MAX];
    char author [MAX];
    char year [MAX];
    float selfCost;
    float selfPrice;
我的文件数据如下所示

1738|Jane Eyre|Charlotte Bronte|1997|2.5|4.09
2743|The Kite Runner|Khaled Hosseini|2018|6.32|8.9
6472|Memoirs of a Geisha|Arthur Golden|2011|4.21|6.61
7263|The Divine Comedy|Dante|2009|5.59|7.98
3547|Outlander|Diana Gabaldon|1996|10.99|12.07
目前,我已经尝试了以下方法

while (fscanf(fi, "%[^|]|%[^|]|%[^|]|%[^|]|%f|%f",bookCode,title,author,year,&selfCost,&selfPrice)==6)
但它只读取一行,然后停止。有什么建议吗

代码

#include <stdio.h>
#include <stdlib.h>
#define INPUT "HW2_file1.txt"
#define MAX 1000 

int main(void)
{

    FILE *fi = fopen(INPUT, "r");
    if (fi!=NULL)
    {
        printf ("Input file is opened sucesfully\n");
    }
    else
    {
        perror ("Error opening the file: \n");
        exit(1);
    }
    ReadingData(fi);

    fclose(fi);
    return 0;
}
void ReadingData (FILE *fi)
{
    int i=0;
    char bookCode[MAX];
    char title [MAX];
    char author [MAX];
    char year [MAX];
    float selfCost;
    float selfPrice;
    while (fscanf(fi, " %[^|]|%[^|]|%[^|]|%[^|]|%f|%f",bookCode,title,author,year,&selfCost,&selfPrice)==6)
    {

        printf ("%s %s %s %s %.2f %.2f\n",bookCode,title,author,year,selfCost,selfPrice);
        i++;
        printf ("%d\n",i);
    }
}
#包括
#包括
#定义输入“HW2_file1.txt”
#定义最大1000
内部主(空)
{
文件*fi=fopen(输入,“r”);
如果(fi!=NULL)
{
printf(“成功打开输入文件\n”);
}
其他的
{
perror(“打开文件时出错:\n”);
出口(1);
}
读取数据(fi);
fclose(fi);
返回0;
}
无效读取数据(文件*fi)
{
int i=0;
字符图书编码[MAX];
字符标题[MAX];
字符作者[MAX];
字符年[最大值];
浮动成本;
浮动价格;
而(fscanf(fi,“%[^ |]]%[^ |]%[^ |]]%[^ |]%[^ |][f |%f”,书号、书名、作者、年份、自售成本和自售价格)==6)
{
printf(“%s%s%s%s%.2f%.2f\n”,书号、标题、作者、年份、自付成本、自付价格);
i++;
printf(“%d\n”,i);
}
}
您的代码工作正常(只要我在调用之前重新排序定义
ReadingData
,添加必要的
#include
#define MAX
,并对其进行简化以除去未使用的
数据类型;我还压缩了变量声明以尝试将TIO链接放入注释中,但结果是徒劳的乐):

#包括
#定义最大值256
无效读取数据(文件*fi)
{
int i=0;
字符图书编码[MAX],标题[MAX],作者[MAX],年份[MAX];
浮动自成本、自定价;
而(fscanf(fi,“%[^ |]]%[^ |]%[^ |]]%[^ |]%[^ |][f |%f”,书号、书名、作者、年份、自售成本和自售价格)==6)
{
printf(“%s%s%s%s%.2f%.2f\n”,书号、标题、作者、年份、自付成本、自付价格);
i++;
printf(“%d\n”,i);
}
}
内部主(空)
{
读取数据(标准数据);
返回0;
}

它将运行,很好,与您提供的输入。因此,要么您的输入是错误的,您省略了代码,要么您有一些其他的问题,缺乏一个最小的,可复制的例子掩盖了这些问题。

@user3121023#define MAX 30在其周围放置了一个C包装,无法复制。请发布显示问题的。注意,每个
bookCode
将以新行开头,第一行除外。您可以通过在第一行
%
之前添加空格来过滤掉它,如
fscanf(fi,“%[^ |]…
@WeatherVane抱歉,我不明白还需要什么,因为我发布了复制所需的所有内容(除了打开文件的部分)显示问题的MRE可以复制/粘贴、编译和运行,以便我可以体验相同的故障。您尚未发布显示故障的部分。如注释所示,我尝试使用您发布的代码,但它没有“在第一行之后停止”“。因此,我不得不猜测这可能与出现的零散换行有关。很抱歉:“您没有发布显示故障的部分”表示代码。完整的代码。我已经说过两次,您发布的代码运行。我们需要生成屏幕截图的代码。”(使用的数据与您发布的数据不同)。