Fork me on GitHub

C语言文件读写操作

C语言文件读写操作

需求:按照要求查找一个文本文件中的某一行,将该行文本保存到另一个文本文件中,并在原文件中删除该行

思路:首先获取该文件中文本的行数,再按照要求(行号或行首的编号)找到该行,并记录该行的行号,读取并保存到另一个文本文件中,最后就是删除原文件中的该行信息

C语言的文件操作函数中,并没有删除文件中某一行的函数,所以需要自己实现,实现思路如下:

首先用fgets函数将文件中的每行读出(要删除的那行除外,这就是为什么前面要获取行数),保存到一个动态申请的二维数组中str[len][255](len为总行数,255为每行最大的字符数)

最后将str中的字符串一行一行的写入到原来的文本文件中,首行用fopen(file, "w") , 以"W"的权限写入就覆盖掉了原来的信息,然后后面的其他行就以fopen(file, "a") ,”a“的权限添加到文件中

 

代码:

获取文件的文本行数:

int getlen(char const * file1)
{
    FILE *fp = fopen(file1, "r");
    char str[255];
    int len = 0;

    while(fgets(str, 255, fp))
    {
        len++;
    }  

    fclose(fp);

    return len;
}

 

找到要删除的行,并返回行号

int lineFind(char const * file1, const int id, char * targetline, int len)
{
    FILE *fp = fopen(file1, "r");
    char strLine[255];
    char str[7];
    int num;
    len = 0;
    int lineNum = 0;
    while(fgets(strLine, 255, fp))
    {
        strncpy(str, strLine, 6);
        str[6] = '\0';
        if(id == strToInt(str))
        {
             lineNUme = len;
             strncpy(targetLine, strLine, 255);
        }

        len ++;
    }

    fclose(fp);

    return lineNum;
}

id 为要删除行行首的编号,strToInt()函数是自己写的,将字符串数字转换成整数

 

将要删除的行保存到另一个文本文件中

void lineCopy(char const * file2, char * strLine)
{
    FILE *fp = fopen(file2, "a");
    
    fprintf(fp, "%s", strLine);

    fclose(fp);

}

 

删除行

char * lineDelete(char const *file1, int len, int lineNum, char * src)
{
   // 创建二维数组
    char ** strget = (char ** )malloc(sizeof(char *) * len);
    int j;
    for(j=0;j<len;j++)
    {
        strget[j] = (char *)malloc(sizeof(char) * 255);
    }

    FILE *fp = fopen(file1, "r");
    
    // 先获取到所有行的文本
    int i=0;
    while(fgets(strget[i], 255, fp))
    {
        i++;
    }
    fclose(fp);

    //先写入首行覆盖原来的信息
    FILE *fp1 = fopen(file1, "w");
    fprintf(fp1, "%s", strget[0]);
    fclose(fp1);

    // 再写入剩余的除删除行外的其他行
    FILE *fp2 = fopen(file1, "a");
    for(i=1;i<len;i++)
    {
        if(i == lineNUm)
        {
            strcpy(src, strget[i]);
            continue;
        }

        fprintf(fp1, "%s", strget[i]);
    }
    fclose(fp2);

    // 释放内存
    for(i=0;i<len;i++)
    {
        free(strget[i]);
    }
    free(strget);

    return src;
}

 

posted @ 2020-09-16 20:10  小黑子杜  阅读(975)  评论(0编辑  收藏  举报