【C语言】【文件流】【行读取】c语言实现文件的行读取、插入、删除

c语言实现文件的行读取、插入、删除

一、要求

  1. 读取指定行的数据
  2. 将读取到的数据插入到另一指定行
  3. 将刚刚插入的数据删除恢复原文件

二、源代码

  • 程序代码——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

三、实验结果截图

实验结果
参考文章:链接

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值