我有一个csv文件,看起来像这样:

Jake, 25, Montreal
Maria, 32, London
Alex, 19, New York
Jake, 22, Dubai


我正在尝试实现的功能是find_name,它应该遍历每个记录的第一个字段并将其与正在搜索的名称进行比较。

我尝试了fgets,fscanf,但是代码不起作用或出现分段错误。

这是我到目前为止所拥有的:

void find_name(const char *csv_filename, const char *name){
    FILE *csvFile = fopen(csv_filename, "r");
    char word[1000];

    if (csvFile == NULL)
            exit(EXIT_FAILURE);

    while ( !feof(csvFile) ) {
            fscanf(csvFile, "%s%*[^,]", word);
            if ( strcmp(word, name) == 0 )
                    printf("name found");
    }
    fclose(csvFile);
}


任何帮助表示赞赏。

编辑:我不想使用任何标记程序功能,我想了解如何使用fscanf。

最佳答案

关于:

 while ( !feof(csvFile) ) {
        fscanf(csvFile, "%s%*[^,]", word);
        if ( strcmp(word, name) == 0 )
                printf("name found");
}


建议使用:

while ( fgets( word, sizeof(word), csvFile ) )
{
    char *token = strtok( word, ", " );
    if( strcmp( token, name )  == 0 )
    {
         printf("name found");
    }
}


但是,如果您不想使用strtok(),则建议:

while ( fgets( word, sizeof word, csvFile ) )
{
    char *comma = strchr( word, ',');
    *comma = \0';

    if( strcmp( word, name )  == 0 )
    {
         printf("name found");
    }
}


但是,如果您确实要使用scanf()系列函数:

while ( fgets( word, sizeof word, csvFile ) )
{
    char possibleMatch[1000];
    if( sscanf( "%999[^,]", word, possibleMatch ) == 1 )
    {
        if( strcmp( possibleMatch, name )  == 0 )
        {
            printf("name found");
        }
    }
}


但是,如果您确实要使用fscanf()

while ( fscanf( csvFile, "%999[^,]", word ) == 1 )
{
    if( strcmp( word, name )  == 0 )
    {
        printf("name found");
    }

    //consume rest of input file line
    int ch;
    while( ( ch = getchar() ) != EOF && ch != '\n' ){;}
}


甚至更好:

while ( fscanf( csvFile, " %999[^,] %*[^\n]", word ) == 1 )
{
    if( strcmp( word, name )  == 0 )
    {
        printf("name found");
    }
}

关于c - 如何在C中读取CSV文件的第一项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55426034/

10-08 22:54