2014-05-14 83 views
0

我有這個文本文件:ANSI C - 文本文件:修改行?

Line 1. "house" 
Line 2. "dog" 
Line 3. "mouse" 
Line 4. "car" 
... 

我想換2號線的「狗」,在新的生產線2「卡」

我該怎麼辦?

謝謝!

(對不起我的英語不好)

+2

通常的方法是打開你的文件輸入和一個新的文件輸出。然後處理輸入文件並根據需要創建新文件。關閉這兩個文件後,刪除原始輸入文件並重命名輸出文件。 – pmg

回答

0

您的程序可以是這樣的:

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_LINE_LENGTH 1000 

int main() 
{ 
    FILE * fp_src, *fp_dest; 
    char line[MAX_LINE_LENGTH]; 

    fp_src = fopen("PATH_TO_FILE\\test.txt", "r"); // This is the file to change 
    if (fp_src == NULL) 
    exit(EXIT_FAILURE); 

    fp_dest = fopen("PATH_TO_FILE\\test.txt_temp", "w"); // This file will be created 
    if (fp_dest == NULL) 
    exit(EXIT_FAILURE); 


    while (fgets(line, 1000, fp_src) != NULL) { 

    if (strncmp(line, "Line 2.", 7) == 0) { 
     fputs("Line 2. \"cards\"\n", fp_dest); 
     printf("Applied new content: %s", "Line 2. \"cards\"\n"); 
    } 
    else { 
     fputs(line, fp_dest); 
     printf("Took original line: %s", line); 
    } 

    } 

    fclose(fp_src); 
    fclose(fp_dest); 

    unlink("PATH_TO_FILE\\test.txt"); 
    rename("PATH_TO_FILE\\test.txt_temp", "PATH_TO_FILE\\test.txt"); 

    exit(EXIT_SUCCESS); 
} 

以下的事情采取這一解決方案爲一些生產系統時,您應考慮:

  • 是否最大線路長度1000 staisfy您的需求 - 也許你想拿出使用malloc()動態分配內存一條線的解決方案
  • 你應該採取一些隨機的文件名發生器生成臨時文件,並確保它不存在,所以你不要覆蓋現有文件
  • 大文件這種方法也許不是最好的,因爲你有效地讓你的文件內容兩次在內存中
2

不能編輯磁盤文件內聯。你必須遵循的過程:

  • 讀取文件數據緩存,(fopen() - >fread()/fgets()

  • 然後刪除舊文件,(unlink()/remove()

  • 然後修改數據在緩衝區中,

  • 回寫緩衝區到一個新文件,(fwrite

  • 將其重命名爲原始文件。 (rename()

+0

示例代碼? – gda2it

+0

@ gda2it:我不相信提供工作代碼。代碼將解決OP的問題,但他可能會選擇不環顧/研究「外來」功能(如「unlink」)的用法,這對他來說將來沒用。他可能會回到這裏再次提出同樣的問題。 –