C语言新手必看:用fopen和fprintf手把手教你读写CSV文件(附完整代码)
C语言新手必看用fopen和fprintf手把手教你读写CSV文件附完整代码刚接触C语言的文件操作时很多新手会遇到这样的困惑程序运行时的数据如何保存到文件中又该如何从文件中读取数据CSV文件作为一种简单通用的数据格式是入门文件操作的绝佳起点。本文将用最直白的语言带你一步步实现CSV文件的读写操作。1. 准备工作理解CSV与文件操作基础CSVComma-Separated Values文件本质上是一个纯文本文件用逗号分隔不同字段。例如一个学生信息的CSV可能长这样Name,Age,Score 张三,18,95 李四,19,88在C语言中我们主要通过stdio.h头文件提供的函数进行文件操作。核心函数包括fopen()打开文件返回文件指针fprintf()向文件写入格式化数据fscanf()从文件读取格式化数据fclose()关闭文件新手常见误区忘记检查文件是否成功打开这会导致后续操作全部失败。2. 写入CSV文件从零开始创建数据文件让我们先实现一个将学生信息写入CSV的程序。完整代码如下#include stdio.h int main() { // 1. 声明文件指针 FILE *file; // 2. 打开文件写入模式 file fopen(students.csv, w); if (file NULL) { printf(无法创建文件\n); return 1; } // 3. 写入表头 fprintf(file, Name,Age,Score\n); // 4. 写入数据行 fprintf(file, 张三,18,95\n); fprintf(file, 李四,19,88\n); // 5. 关闭文件 fclose(file); printf(数据已成功写入students.csv\n); return 0; }关键点解析文件模式选择w写入模式会创建新文件或覆盖已有文件a追加模式在文件末尾添加内容错误处理每次fopen后都应检查返回值是否为NULL文件路径可以是相对路径或绝对路径数据格式每行末尾需要加\n换行符字段间用逗号分隔3. 读取CSV文件解析结构化数据现在我们来读取刚才创建的CSV文件。完整示例#include stdio.h #include string.h int main() { FILE *file; char line[100]; file fopen(students.csv, r); if (file NULL) { printf(文件打开失败\n); return 1; } // 跳过表头 fgets(line, sizeof(line), file); printf(学生信息列表\n); while (fgets(line, sizeof(line), file)) { // 移除行末的换行符 line[strcspn(line, \n)] \0; // 使用strtok分割字符串 char *name strtok(line, ,); char *age strtok(NULL, ,); char *score strtok(NULL, ,); printf(姓名%s年龄%s分数%s\n, name, age, score); } fclose(file); return 0; }技术细节说明fgets()逐行读取文件内容strtok()字符串分割函数第一个参数为待分割字符串后续调用传NULLstrcspn()计算不包含指定字符的初始段长度实际项目中应考虑使用更健壮的CSV解析方法比如处理字段中的逗号、引号等特殊情况。4. 实战技巧与常见问题排查4.1 文件路径问题相对路径的基准是程序运行时的当前工作目录。为避免混淆可以使用绝对路径file fopen(/home/user/data/students.csv, r);或者在程序开始时获取当前路径char cwd[1024]; getcwd(cwd, sizeof(cwd)); printf(当前工作目录%s\n, cwd);4.2 处理中文编码如果CSV包含中文需要注意确保文件以UTF-8编码保存Windows系统可能需要处理BOM头4.3 内存安全最佳实践总是检查数组边界#define MAX_LINE 1024 char line[MAX_LINE]; fgets(line, MAX_LINE, file);使用安全的字符串函数strncpy(dest, src, sizeof(dest)-1); dest[sizeof(dest)-1] \0;4.4 性能优化建议处理大文件时避免频繁的小块读写考虑使用内存映射文件批量处理数据而非逐行处理5. 扩展应用构建简易学生管理系统结合文件操作我们可以实现一个完整的学生信息管理系统框架#include stdio.h #include string.h typedef struct { char name[50]; int age; float score; } Student; void addStudent(FILE *file) { Student s; printf(输入学生姓名); scanf(%s, s.name); printf(输入学生年龄); scanf(%d, s.age); printf(输入学生分数); scanf(%f, s.score); fprintf(file, %s,%d,%.2f\n, s.name, s.age, s.score); } int main() { FILE *file fopen(students_db.csv, a); if (!file) { printf(数据库打开失败\n); return 1; } int choice; do { printf(\n学生管理系统\n); printf(1. 添加学生\n); printf(2. 列出所有学生\n); printf(0. 退出\n); printf(请选择); scanf(%d, choice); switch(choice) { case 1: addStudent(file); break; case 2: // 列出学生实现类似前面的读取代码 break; } } while (choice ! 0); fclose(file); return 0; }这个示例展示了如何将文件操作应用到实际项目中。通过这个框架你可以继续扩展查询、修改等功能。