#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <unistd.h> /* 读取csv文件 存入新的文件 */ int read_line(int fd_data,unsigned char *data_buf){ //逐行读取,赋值给data_buf unsigned char c; int len; int i = 0; int err = 0; while(1){ //循环写入字符 len = read(fd_data,&c,1); if(len <=0){ err = -1; break; } else{ if(c!=' ' && c != ' '){ //判断是否碰到换行符和空格符号 没有碰到加入data_buf,碰到则退出 data_buf[i] = c; i++; } else{ err = 0; break; } } } data_buf[i] = ' '; // 在结尾添加结束符 if (err && (i == 0)){ // 没有报错但是也没有读取到值 return -1; //返回-1 报错 } else{ return i; } } void process_data(unsigned char *data_buf,unsigned char *result_buf){ //处理数据函数 将逐行读取到的参数复制给要写入的参数 char name[50]; int score[5]; int sum = 0; char *levels[] = {"S","A","B"}; int level; //我写的 // for(int j = 0;j < strlen(data_buf);j++){ // result_buf[j] = data_buf[j]; // if(data_buf[j] == ' '){ // break; // } // } //老师写的 if (data_buf[0] == 0x2c){ //对于UTF-8编码的文件,它的前三个字符是0xef 0xbb 0xbf 可以使用hexdump -C data.csv 将csv文件内容以16进制展示查看第一行的开头是什么字符 strcpy(result_buf,data_buf); //字符串复制 sprintf(result_buf,"%s ",result_buf); } else{ sscanf(data_buf,"%[^,],%d,%d,%d,%d,%d,",name,&score[0],&score[1],&score[2],&score[3],&score[4]);//将字符串里的值赋值给变量进行操作 sum = score[0] + score[1] + score[2] + score[3] + score[4]; if(sum > 370){ level = 0; }else if(sum > 360){ level = 1; }else{ level = 2; } sprintf(result_buf,"%s,%d,%d,%d,%d,%d,%d,%s ",name,score[0],score[1],score[2],score[3],score[4],sum,levels[level]); } } void write_data(unsigned char *result_buf,int fd_result){ //写入函数 unsigned char c; int len; int i = 0; int err = 0; len = write(fd_result,result_buf,strlen(result_buf)); //write函数返回写入字符数量 if(len != strlen(result_buf)){ perror("write"); } } int main(int argc, char **argv){ //argc是写入参数数量int型 argv为输入的参数 是个数组 int fd_data,fd_result; int len,xunhuan = 0; unsigned char data_buf[1000]; unsigned char result_buf[1000]; if(argc != 3){ //判断 如果输入的参数不是3个报错 printf("Usage: %s <file> <data csv file> <result csv file> ",argv[0]); return -1; } fd_data = open(argv[1],O_RDONLY, 0644); if(fd_data <0){ printf("can not open file %s ",argv[1]); perror("open"); return -1; } else{ printf("fd = %d ",fd_data); } fd_result = open(argv[2],O_RDWR | O_CREAT | O_TRUNC, 0644); //如果要写入的csv文件不存在,新建 if(fd_result <0){ printf("can not create file %s ",argv[2]); perror("open"); return -1; } else{ printf("fd = %d ",fd_result); } while(1){ len = read_line(fd_data,data_buf); if(len == -1){ break; } if(len != 0){ xunhuan++; process_data(data_buf,result_buf); printf("写入第%d行",xunhuan); printf("line : %s ",result_buf); write_data(result_buf,fd_result); } } printf("传输完成!已经把内容从 %s 传输到 %s ",argv[1],argv[2]); //argv['./rw_csv','<读取的csv文件> ','<要写入的csv文件>'] close(fd_data); close(fd_result); return 0; }
Linux终端输入(rw_csv.c为代码文件名)