纯C语言 读取写入表格

纯C语言支持.xls表格的读取,但是不支持.xls表格的写入
所以在这篇文章我将对.csv格式的表格进行读写

.csv格式

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。

  • .csv中每个单元格用 “,”隔开
  • 可以用EXCEL打开和创建
  • 操作.csv文件只需要<stdio.h>

C语言代码实现

一、打开.csv文档

用fopen()函数打开文件,下面是该函数的声明:
FILE *fopen(const char *filename, const char *mode);
参数
  • filename — 这是 C 字符串,包含了要打开的文件名称。
  • mode — 这是 C 字符串,包含了文件访问模式,模式如下:
模式 描述
“r” 打开一个用于读取的文件。该文件必须存在。
“w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+” 创建一个用于读写的空文件。
“a+” 打开一个用于读取和追加的文件。
返回值

该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

示例
FILE *fp;
fp = fopen("Text.csv", "w");

二、写入

C语言中文件的写入函数为fprintf(),其声明为:

int fprintf(FILE *stream, const char *format, ...)

stream是指向FILE对象的指针
format指向要输入的文本,这个参数和后面的参数与printf()相同


.csv文件用”,”分隔每个单元,用”\n”换行
例如,我们如果要输入以下表格:

学号 名字
1 张三
2 李四
3 王五
4 赵六

那么代码应该是:

fprintf(fp, "学号,名字\n");
int i = 1;
fprintf(fp, "%d,张三\n",i); i++;
fprintf(fp, "%d,李四\n",i); i++;
fprintf(fp, "%d,王五\n",i); i++;
fprintf(fp, "%d,赵六\n",i); i++;


这里递增了变量 i 来演示怎么输出变量,其用法和printf()一样(注意要是英文的逗号)

生成的Text.csv如图所示

三、读取

C语言读取.csv我们用到fgets()和strtok()两个函数,分别在<stdio.h>和<string.h>中

篇幅原因就不详细介绍这两个函数了,放上菜鸟教程的页面:

  1. fgets()
  2. strtok()

在读取.csv文件时,也是以“,”为单元间的分隔符(注意要是英文的逗号)

保留我们在写入函数时生成的文件,现在我们来读取它并把它显示在控制台上,下面是这部分的代码:

FILE *fp;
fp = fopen("Text.csv", "r");
char *line, *record;
char buffer[1024];
while ((line = fgets(buffer, sizeof(buffer), fp)) != NULL) 
{
  record = strtok(line, ",");
  printf("%8s",record);
  record = strtok(NULL, ",");
  printf("%8s\n", record);
}
fclose(fp);

大致的思路是,先用fgets()读取一行的所有字符,然后用strtok()在“,”处截断

这里要注意的是,第一次是strtok(line.”,”),之后是strtok(NULL,”,”)

这里每个单元格都是已字符串的形式读取的,如果想把它转成整型或者浮点数,可以用sscanf(),相关介绍放上链接:sscanf()

就是从字符串读取格式化输入。

结果如下:

四、示例

暂时就不放示例了,有什么讲得不对的地方请评论

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒