Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
使用fscanf逐行遍历文件_C_File_Printf_Traversal_Scanf - Fatal编程技术网

使用fscanf逐行遍历文件

使用fscanf逐行遍历文件,c,file,printf,traversal,scanf,C,File,Printf,Traversal,Scanf,好的,我有一个文本文件database.txt 每行都是具有以下格式的用户 "John Smith"| 4| 80.00| "123 Lollipop Lane"| "New Jersey"| "08080" 当我尝试执行以下操作时: database = fopen(fileName,"r"); while(fscanf(database,"%[^\n]", buffe

好的,我有一个文本文件database.txt

每行都是具有以下格式的用户

"John Smith"| 4| 80.00| "123 Lollipop Lane"| "New Jersey"| "08080"  
当我尝试执行以下操作时:

database = fopen(fileName,"r");
while(fscanf(database,"%[^\n]", buffer) != EOF) { 
    printf("ATTEMPT TO: Insert user %s\n\n", buffer); 
    if (insert_Customer(clients, create_Customer(buffer)) < 0) { 
        printf("\nERROR: Failed to insert and create customer %s\n", buffer); 
    }
    else printf("\nSUCCESS: Inserted Customer %s\n\n", buffer); 
} 
database=fopen(文件名,“r”);
而(fscanf(数据库,“%[^\n]”,缓冲区)!=EOF){
printf(“尝试:插入用户%s\n\n”,缓冲区);
如果(插入客户机,创建客户机(缓冲区))<0{
printf(“\n错误:无法插入和创建客户%s\n”,缓冲区);
}
else printf(“\n成功:插入的客户%s\n\n”,缓冲区);
} 
第一行运行良好,将整行发送到create_Customer(char*buffer)函数。出于某种原因,我不明白,在第一行之后,它不断尝试发送“John Smith”,而不是继续下一行。我相信我的格式不正确,但我不知道如何完成我试图完成的任务,即逐行读取此文件并将每一行传递到create_Customer函数。

您必须使用,而不是
fscanf
fscanf
将一直读取,直到它包含\n(新行)字符,而您可以使用fgets读取与您使用的代码完全相同的所有行!
希望这有帮助:)

我想你需要一个结束语
\n
。我用
%[^\n]
看到了一堆第一行的滚动文本,但用
%[^\n]\n
看到了预期的输出

但是,如果文件中的行数超过了缓冲区的行数,则可能会遇到缓冲区空间不足的问题。结果

测试v1: 代码 测试v2: 让我们修复代码,这样我们就不会溢出缓冲区。为此,我们将
%[^\n]\n
更改为
%30[^\n]\n
。这告诉fscanf它最多只能使用缓冲区的大小--30

代码 test.txt 这就是我使用的测试文件的外观

12343456567856789
zbasdflkjasdfkjklsdafjklas
zxcvjkleryjkldhfg
1234567890123456789012341234
12345678901234567890123123asdfjklzxcv;jkl;eqwrtjklkzlcxvjkleqrt41234

您使用
fscanf
而不是
fgets
的任何原因

如果使用
fgets
,需要注意的一点是,您可能需要去除
\n
字符,因为它将作为字符串的一部分包含

fgets

从流中读取字符并将其作为C字符串存储到str中 直到读取了(num-1)个字符或换行符或 到达文件末尾,以先发生的为准

示例:

/* fgets example */
#include <stdio.h>

int main()
{
    FILE * database;
    int res;
    char buffer [100];

    database = fopen(fileName,"r");

    if (NULL == database) {
        perror("opening database file");
        return (-1);
    }

    /* while not end-of-file */
    while (!feof(database)) { 

        /* we expect buffer pointer back if all is well, get out if we don't get it */
        if (buffer != fgets(buffer, 100, database))
            break;

        /* strip /n */
        int len = strlen(buffer);
        if (buffer[len - 1] == '\n')
            buffer[len - 1] = 0;

        printf("ATTEMPT TO: Insert user %s\n\n", buffer); 

        if (insert_Customer(clients, create_Customer(buffer)) < 0)
            printf("\nERROR: Failed to insert and create customer %s\n", buffer); 
        else
            printf("\nSUCCESS: Inserted Customer %s\n\n", buffer);
    }

    /* a little clean-up */
    fclose(database);

    return (0);
}
/*fgets示例*/
#包括
int main()
{
文件*数据库;
国际关系;
字符缓冲区[100];
数据库=fopen(文件名,“r”);
if(NULL==数据库){
perror(“打开数据库文件”);
返回(-1);
}
/*而不是文件的结尾*/
而(!feof(数据库)){
/*如果一切正常,我们希望缓冲区指针返回,如果没有得到,请退出*/
if(缓冲区!=fgets(缓冲区,100,数据库))
打破
/*带/n*/
int len=strlen(缓冲区);
如果(缓冲区[len-1]='\n')
缓冲区[len-1]=0;
printf(“尝试:插入用户%s\n\n”,缓冲区);
如果(插入客户机,创建客户机(缓冲区))<0)
printf(“\n错误:无法插入和创建客户%s\n”,缓冲区);
其他的
printf(“\n成功:插入的客户%s\n\n”,缓冲区);
}
/*稍微打扫一下*/
fclose(数据库);
返回(0);
}

问题是您的
fscanf
永远不会读取第一行末尾的换行符。因此,当第二次调用它时,它将失败(返回0,而不是EOF)并且不读取任何内容,保持
缓冲区
不变


您可以添加对
fscanf(“%*[\n]”)的调用在while循环结束时跳过换行符(以及可能出现的任何空行)。或者您可以只使用
fgets
,这也可以更容易地避免潜在的缓冲区溢出问题。

您应该在说明符“%[^\n]”后加一个空格或使用“%[^\n]\n”。两者都允许您跳过换行符

fscanf(database, "%[\n] ", buffer);


检查来自fscanf的返回代码,了解第一次成功读取后读取的字符数。粗略猜测,它会返回0,因为您让它读取除新行以外的任何内容这些示例中的一个不是?哪一个?
> 12343456567856789
> zbasdflkjasdfkjklsdafjklas
> zxcvjkleryjkldhfg
> 1234567890123456789012341234
> 12345678901234567890123123asdf
> jklzxcv;jkl;eqwrtjklkzlcxvjkle
> qrt41234
12343456567856789
zbasdflkjasdfkjklsdafjklas
zxcvjkleryjkldhfg
1234567890123456789012341234
12345678901234567890123123asdfjklzxcv;jkl;eqwrtjklkzlcxvjkleqrt41234
/* fgets example */
#include <stdio.h>

int main()
{
    FILE * database;
    int res;
    char buffer [100];

    database = fopen(fileName,"r");

    if (NULL == database) {
        perror("opening database file");
        return (-1);
    }

    /* while not end-of-file */
    while (!feof(database)) { 

        /* we expect buffer pointer back if all is well, get out if we don't get it */
        if (buffer != fgets(buffer, 100, database))
            break;

        /* strip /n */
        int len = strlen(buffer);
        if (buffer[len - 1] == '\n')
            buffer[len - 1] = 0;

        printf("ATTEMPT TO: Insert user %s\n\n", buffer); 

        if (insert_Customer(clients, create_Customer(buffer)) < 0)
            printf("\nERROR: Failed to insert and create customer %s\n", buffer); 
        else
            printf("\nSUCCESS: Inserted Customer %s\n\n", buffer);
    }

    /* a little clean-up */
    fclose(database);

    return (0);
}
fscanf(database, "%[\n] ", buffer);
fscanf(database, "%[\n]\n", buffer);