c语言实现文件的行读取、插入、删除
一、要求
- 读取指定行的数据
- 将读取到的数据插入到另一指定行
- 将刚刚插入的数据删除恢复原文件
二、源代码
- 程序代码——test3All.c
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#define SIZE 512
#define OK 1
#define ERROR 0
char* readFile(char* filePath, int readline)
{
static char data[SIZE]; //静态局部变量
int line=0;//记录当前读取行数
FILE *fp=fopen(filePath,"r");//打开文件,只读
if(!fp)
{//打开失败
printf("can't open file\n");
return "false";
}
while(!feof(fp))
{
line++;
fscanf(fp,"%s", &data);
if(line == readline)
{//当读取到第 readline 时,返回读取内容
return data;
break;
}
}
fclose(fp);
}
int writeFile(char* filePath, int writeline, char* buf)
{
char data[SIZE][SIZE];
int line=0;//记录当前读取行数
int sign=-1, index;
fpos_t position;//文件流位置指针
FILE *fp=fopen(filePath,"r+");//打开文件,读写
if(!fp)
{//打开失败
printf("can't open file\n");
}
//循环使文件流位置指针到达需写入位置
for( line=1; line<writeline; line++)
{
fgets(data[line], SIZE, fp);
if(feof(fp)) break;
}
sign = fgetpos(fp, &position);
//记录文件流位置指针当前位置即写入位置
if(sign)//fgetpos执行失败
return ERROR;
index = line;//记录数组中后面数据的位置
//保存后面数据
while(!feof(fp))
{
fgets(data[line++], SIZE, fp);
}
fsetpos(fp, &position); //设置文件流指针回到需写入位置
fprintf(fp, "%s\n", buf);
for( ; index<line; index++)
{
fprintf(fp, "%s", data[index]);
}
// printf("%s",data[line-1]);
// fgets(data[line], SIZE, fp);
// printf("%s",data[line]);
fclose(fp);
return OK;
}
int delete(char* filePath, int writeline)
{
char data[SIZE][SIZE];
int line=0;//记录当前读取行数
int sign=-1, index;
fpos_t position;//文件流位置指针
FILE *fp=fopen(filePath,"r+");//打开文件,读写
if(!fp)
{//打开失败
printf("can't open file\n");
}
//循环使文件流位置指针到达需删除位置
for( line=1; line<writeline; line++)
{
fgets(data[line], SIZE, fp);
if(feof(fp)) break;
}
sign = fgetpos(fp, &position);
//记录文件流位置指针当前位置即删除位置
if(sign)//fgetpos执行失败
return ERROR;
index = line;//记录数组中后面数据的位置
//printf("第%d行:%s", index, data[index]);
//保存后面数据
while(!feof(fp))
{
fgets(data[line++], SIZE, fp);
}
fclose(fp);
//以覆盖写入方式重新打开输入流
fp = fopen(filePath, "w");
if(!fp)
{//打开失败
printf("can't open file\n");
return ERROR;
}
int n=0;
for( ; n<index; n++)
{
fprintf(fp, "%s", data[n]);
}
for(n=index+1; n<line; n++)
{
fprintf(fp, "%s", data[n]);
}
fclose(fp);
return OK;
}
int main(int argc, char **argv)
{
char* buf;//保存读取的内容
//读取
int readline = 0;
printf("请输入读取行数:");
scanf("%d", &readline);
buf = readFile(argv[1], readline);
printf("%s\n", buf);
//写入
int writeline = 0, sign;
printf("请输入写入行数:");
scanf("%d", &writeline);
sign = writeFile(argv[1], writeline, buf);
if(sign == OK)
printf("Write over!\n");
else
printf("Write ERROR!\n");
/*-----------------------------------------------------
这里利用系统函数执行了cat.sh文件
该shell脚本即调用cat命令显示文件内容
-----------------------------------------------------*/
printf("删除前:\n");
system("sh ./cat.sh");
//删除
sign = delete(argv[1], writeline);
if(sign == OK)
printf("Delete over!\n");
else
printf("ERROR!\n");
printf("删除后:\n");
system("sh ./cat.sh");
return 0;
}
- 脚本代码——cat.sh
注意:编写完成后要给脚本执行权限!!!
#!/bin/bash
cat -n ./t.txt
三、实验结果截图
参考文章:链接