C实现删除指定的文本文件指定的一行

/* 删除文件的指定行          */
//删除一个文件的注释

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stddef.h>
#include <errno.h>

#define MAX_BUFF_SIZE (1024)

int del_comment(void)
{
	FILE *fp_r    = NULL;
	FILE *fp_w    = NULL;
	char t1;
	char t2;
    
	fp_r = fopen("a.c", "rb");
	fp_w = fopen("b.c", "wb");

	while(fread(&t1, 1, 1, fp_r))
	{
		if(t1 == '/')
		{
			fread(&t2, 1, 1, fp_r);
			if(t2 == '/')                 //读到了 '//'注释
			{
				while(fread(&t2, 1, 1, fp_r))
				{
					if(t2 == '\n')               //读到换行符为止
					{
						break;
					}
				}
		    fwrite(&t2, 1, 1, fp_w);        //写入换行符,防止改变格式
			}
			else if(t2 == '*')                  // 读到了/*注释
			{
				while(fread(&t2, 1, 1, fp_r))
				{
					if(t2 == '*')           //没读到*就一直向后读
					{
						fread(&t2, 1, 1, fp_r);
						if( t2 == '/')      //读到了*/
						{
							break;
						}
						else           //这句话是为了防止结尾的地方有两个*连在一起
						{
							fseek(fp_r, -1, SEEK_CUR);   
							//如果*后面不是/,就把指针向后移动一位继续寻找*
						}
					}
				}
			}
			else
			{
				fwrite(&t1, 1, 1, fp_w);   //如果只读到一个'/'就把上面两个读过的都写入
				fwrite(&t2, 1, 1, fp_w);
			}
		}
		else if(t1 == '\"')    //“” 里面的所有内容都写进去
		{
			fwrite(&t1, 1, 1, fp_w);
			while(fread( &t1, 1, 1, fp_r))
			{
				fwrite(&t1, 1, 1, fp_w);
				if(t1 == '\"')
				{
					break;
				}
			}
		}
		else
		{
			fwrite(&t1, 1, 1, fp_w);   // 如果读不到'/'就一直写
		}
	}
    
	fclose(fp_w);
	fclose(fp_r);

    return 0;
}

int del_one_line(const char * path, int del_line)
{
    int ret        = -1;
    FILE * fp_r    = NULL;
    FILE * fp_w    = NULL;
    char * buffer  = NULL;
    size_t  sz     = MAX_BUFF_SIZE;
    int line_num   = 0;
    int count      = 0;
    int i          = 0;
    const char * tmp_path = "a";
    char read_buff[MAX_BUFF_SIZE] = { 0 };
    
    if(path == NULL || del_line < 0)
    {
        fprintf(stderr, "args error");
        return -1;
    }
    
    //1.open file used read only and write only
    fp_r = fopen(path, "r+");
    if(fp_r == NULL)
    {
        fprintf(stderr, "fp_r open error\n");
        return -1;
    }

    fp_w = fopen(tmp_path, "w+");
    if(fp_w == NULL)
    {
         perror("fopen tmp_path");
         return -2;
    }

    //2.get file line number
    
    buffer = (char *) malloc(sz*sizeof(size_t));
    while((ret = getline(&buffer, &sz, fp_r)) > 0)
    {
        line_num++;
    }
    
    printf("line_num=%d\n", line_num);
    
    if(buffer != NULL)
    {
      free(buffer);
      buffer = NULL;
    }

    if(del_line > line_num)
    {
        fprintf(stderr, "args error\n");
        return -1;
    }
    
    rewind(fp_r);
    
    //3.read line and write line
    memset(read_buff, 0, sizeof(read_buff));
    for(i=1; i<line_num; ++i)
    {
        fgets(read_buff, MAX_BUFF_SIZE, fp_r);      
        if(i==del_line)
        {
            fgets(read_buff, MAX_BUFF_SIZE, fp_r);      
        }
        fputs(read_buff, fp_w);
//        printf("%s", read_buff);
    }
    
    fclose(fp_r);
    fclose(fp_w);

    //4.delete tmp file,use final filename
    rename(tmp_path, path);    

    return 0;
}

int main(int argc, const char* argv[])
{
	int ret = 0;
    int del_num = 0;
    if(argc < 3)
    {
        fprintf(stderr, "Usage %s <del_file>  <del_num>\n", argv[0]);
        return -1;
    }
    del_num = atoi(argv[2]);
#if  0

ret = del_comment();
	if(ret != 0)
	{
		fprintf(stderr, "del_commnet error %d", ret);
		return ret;
	}
    
#else

    ret = del_one_line(argv[1], del_num);
	if(ret != 0)
	{
		fprintf(stderr, "del_one_line error %d\n", ret);
		return ret;
	}
    
#endif

    return 0;
}


测试结果

源文件

在这里插入图片描述

执行程序删除第五行

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值