前言
Linux系统编程使用open,read,write,close等文件IO操作函数,实现表格处理:求和和分等级。
一、文件IO操作函数
open,read,write,close等文件IO操作函数,具体使用详见:
https://blog.csdn.net/marsmengrunxin/article/details/135563282?spm=1001.2014.3001.5502
二、实现过程
1.将下面表格中数据求和和分等级
等级划分:大于90为A+;80-90为A;小于80为B。
完整代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
/*返回值:n表示读到一行数据的个数(n>=0)
* -1(读到文件尾部或者出错)
*/
static int rend_line(int fd,unsigned char *buf)
{
/* 循环读入一个字符*/
/* 如何判断已经读完一行? 读到0x0d,0x0a */
unsigned char c;
int len;
int err=0;
int i=0;
while(1)
{
len=read(fd,&c,1);
if(len <= 0)
{
err = -1;
break;
}
else
{
if(c !='\n' && c != '\r')
{
buf[i] = c;
i++;
}
else
{
err = 0;
break;
}
}
}
buf[i]='\0';
if(err && (i == 0))
{
/* 读到文件尾部并且一个数据都没有读到*/
return -1;
}
else
{
return i;
}
}
int process_data(unsigned char *data_buf, unsigned char *result_buf)
{
/* 示例1
示例2
*/
char name[100];
int scores[3];
int sum;
char *levels[]={"A+", "A", "B"};
int level;
if(data_buf[0] == 0xef)
{
strcpy(result_buf, data_buf);
}
else
{
sscanf(data_buf,"%[^,],%d,%d,%d,",name, &scores[0], &scores[1], &scores[2]);
//printf("result: %s,%d,%d,%d\n\r",name, scores[0], scores[1], scores[2]);
//printf("result: %s---->get name---->%s\n\r",data_buf, name);
sum=scores[0]+scores[1]+scores[2];
if(sum >= 270)
level = 0;
else if(sum >= 240)
level = 1;
else
level = 2;
sprintf(result_buf, "%s,%d,%d,%d,%d,%s\n\r",name, scores[0], scores[1], scores[2], sum, levels[level]);
//printf("result: %s",result_buf);
}
}
int main(int argc, char **argv)
{ int fd_data,fd_result;
int i;
int len;
unsigned char data_buf[1000];
unsigned char result_buf[1000];
if(argc !=3)
{
printf("usage: %s <date csv file> <result csv file>\n",argv[0]);
return -1;
}
fd_data=open(argv[1], O_RDONLY);
if(fd_data<0)
{
printf("can not open file %s\n", argv[1]);
perror("open");
return -1;
}
else
{
printf("data file fd = %d\n", fd_data);
}
fd_result = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0777);
if(fd_result < 0)
{
printf("can not create file %s\n", argv[2]);
perror("create");
return -1;
}
else
{
printf("result file=%d\n",fd_result);
}
while(1)
{
/* 从数据元素中读取1行*/
len=rend_line(fd_data,data_buf);
if(len == -1)
{
break;
}
//if(len != 0)
// printf("line: %s\n\r",data_buf);
if(len != 0)
{
/* 处理数据*/
process_data(data_buf,result_buf);
/* 写入结果*/
//write_data(fd_result,result_buf);
write(fd_result, result_buf,strlen(result_buf));
}
}
close(fd_data);
close(fd_result);
return 0;
}
2.结果展示
3.下面代码也可以实现相同功能(只改了两行代码)
完整代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
/*返回值:n表示读到一行数据的个数(n>=0)
* -1(读到文件尾部或者出错)
*/
static int rend_line(int fd,unsigned char *buf)
{
/* 循环读入一个字符*/
/* 如何判断已经读完一行? 读到0x0d,0x0a */
unsigned char c;
int len;
int err=0;
int i=0;
while(1)
{
len=read(fd,&c,1);
if(len <= 0)
{
err = -1;
break;
}
else
{
if(c !='\n' && c != '\r')
{
buf[i] = c;
i++;
}
else
{
err = 0;
break;
}
}
}
buf[i]='\0';
if(err && (i == 0))
{
/* 读到文件尾部并且一个数据都没有读到*/
return -1;
}
else
{
return i;
}
}
int process_data(unsigned char *data_buf, unsigned char *result_buf)
{
/* 示例1
示例2
*/
char name[100];
int scores[3];
int sum;
char *levels[]={"A+", "A", "B"};
int level;
if(data_buf[0] == 0xef)
{
strcpy(result_buf, data_buf);
}
else
{
sscanf(data_buf,"%[^,],%d,%d,%d,",name, &scores[0], &scores[1], &scores[2]);
//printf("result: %s,%d,%d,%d\n\r",name, scores[0], scores[1], scores[2]);
//printf("result: %s---->get name---->%s\n\r",data_buf, name);
sum=scores[0]+scores[1]+scores[2];
if(sum >= 270)
level = 0;
else if(sum >= 240)
level = 1;
else
level = 2;
sprintf(result_buf, "%s,%d,%d,%d,%d,%s",name, scores[0], scores[1], scores[2], sum, levels[level]);
//printf("result: %s",result_buf);
}
}
int main(int argc, char **argv)
{ int fd_data,fd_result;
int i;
int len;
unsigned char data_buf[1000];
unsigned char result_buf[1000];
if(argc !=3)
{
printf("usage: %s <date csv file> <result csv file>\n",argv[0]);
return -1;
}
fd_data=open(argv[1], O_RDONLY);
if(fd_data<0)
{
printf("can not open file %s\n", argv[1]);
perror("open");
return -1;
}
else
{
printf("data file fd = %d\n", fd_data);
}
fd_result = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0777);
if(fd_result < 0)
{
printf("can not create file %s\n", argv[2]);
perror("create");
return -1;
}
else
{
printf("result file=%d\n",fd_result);
}
while(1)
{
/* 从数据元素中读取1行*/
len=rend_line(fd_data,data_buf);
if(len == -1)
{
break;
}
//if(len != 0)
// printf("line: %s\n\r",data_buf);
if(len != 0)
{
/* 处理数据*/
process_data(data_buf,result_buf);
/* 写入结果*/
//write_data(fd_result,result_buf);
write(fd_result, result_buf,strlen(result_buf));
write(fd_result, "\r\n",2);
}
}
close(fd_data);
close(fd_result);
return 0;
}
该处使用的url网络请求的数据。
总结
内容来自韦东山老师表格处理。
https://www.bilibili.com/video/BV1w4411B7a4?p=53&vd_source=d5c3bcee0fd34279af54d73e5d57008b