#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!='\n' && c != '\r'){ //判断是否碰到换行符和空格符号 没有碰到加入data_buf,碰到则退出
data_buf[i] = c;
i++;
}
else{
err = 0;
break;
}
}
}
data_buf[i] = '\0'; // 在结尾添加结束符
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] == '\0'){
// 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\n",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\n",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> \n",argv[0]);
return -1;
}
fd_data = open(argv[1],O_RDONLY, 0644);
if(fd_data <0){
printf("can not open file %s\n",argv[1]);
perror("open");
return -1;
}
else{
printf("fd = %d \n",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\n",argv[2]);
perror("open");
return -1;
}
else{
printf("fd = %d \n",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 \n",result_buf);
write_data(result_buf,fd_result);
}
}
printf("传输完成!已经把内容从 %s 传输到 %s \n",argv[1],argv[2]); //argv['./rw_csv','<读取的csv文件> ','<要写入的csv文件>']
close(fd_data);
close(fd_result);
return 0;
}
Linux终端输入(rw_csv.c为代码文件名)
gcc -o rw_csv rw_csv.c
./rw_csv <读取的csv文件> <要写入的csv文件>