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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM