如何用C语言读取CSV首字段?基于fscanf的查找函数问题求助
问题分析与解决方案
首先,你的代码出现问题主要有两个核心原因:错误的循环终止条件和fscanf格式字符串不匹配CSV的结构。咱们一步步拆解并修复:
原代码的问题点
!feof(csvFile)作为循环条件:这是C语言处理文件的常见误区。feof()只有在尝试读取超过文件末尾时才会返回真,意味着最后一次循环会执行无效读取,可能引发段错误或错误匹配。fscanf("%s%*[^,]", word)的格式错误:%s会读取到第一个空白字符,虽然能拿到姓名,但后续的%*[^,]会尝试读取所有非逗号字符——此时下一个字符是逗号,格式匹配失败,fscanf返回值仅为1(只成功读取了%s部分),导致后续读取位置混乱,甚至读到错误内容。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void find_name(const char *csv_filename, const char *name){ FILE *csvFile = fopen(csv_filename, "r"); // 预留1位给字符串终止符,避免缓冲区溢出 char word[1000]; if (csvFile == NULL) { perror("Failed to open file"); exit(EXIT_FAILURE); } // 用fscanf返回值判断读取是否成功,替代feof的错误用法 // %999[^,]:最多读999个非逗号字符到word,适配数组大小 // ,:匹配姓名后的逗号 // %*[ \n]:读取并丢弃空格、换行符,处理逗号后的空格与换行 while (fscanf(csvFile, "%999[^,],%*[ \n]", word) == 1) { if (strcmp(word, name) == 0) { printf("Name found: %s\n", word); } } fclose(csvFile); }
关键细节解释
%999[^,]:限制最大读取字符数为999,刚好适配word[1000]的容量(最后一位留给\0),避免缓冲区溢出;[^,]表示读取所有非逗号字符,完美匹配CSV第一个字段(姓名)的边界。,%*[ \n]:%*[ \n]中的*代表“读取但不存储”,[ \n]匹配空格和换行符,能跳过姓名后的逗号、空格,以及换行符,确保下一次读取直接定位到下一行的姓名。- 用
fscanf返回值控制循环:fscanf成功读取一个字段时返回1,文件读完或读取失败时返回小于1的值,精准终止循环,避免无效读取。
测试验证
用你提供的CSV内容测试:
Jake, 25, Montreal Maria, 32, London Alex, 19, New York Jake, 22, Dubai
调用find_name("your_file.csv", "Jake")会输出两次Name found: Jake,完全符合预期。
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

