2013-10-31 57 views
1

如何從文件中刪除字節從i到i。從文件中刪除字節 - c

例如:"today me and my roomates went to a party"; 若i = 3,我想刪除第三個字節,6號,9號...等 我嘗試使用lseek的和與fgets,但我不知道該怎麼辦了整個事情。

我試了一下:

FILE* f = fopen(name_file,"r"); 
lseek(f,0,SEEK_SET); 
while(fgets(lune,255,f) != NULL){ 
    lseek(f,i,SEEK_SET); 
} 

我沒有做太多,因爲我不知道該怎麼做。也許你可以幫我解答一些問題和提示。

+0

是否要修改文件本身?如果是這樣,您將希望以超過READ模式打開它。先嚐試'r +'來真正能夠更新文件。 –

+0

@bwtrent我想打開該文件,將修改後的行復制到另一個文件中,刪除原始文件並用原始文件的名稱重命名新文件。 – MathMe

+0

查看類似(但不重複):http://stackoverflow.com/questions/14905126/using-c-to-replace-the-first-half-of-a-file-with-the-second-and-截斷 – hyde

回答

1

如果刪除您的意思是從文件內容(在文件中間)物理刪除字節,則不能這樣做。您必須打開另一個文件並選擇性地複製要保留的內容。所以這樣做是如下:

  • open()讀取源文件(我認爲低級別的I/O,但STDLIB f*功能將類似的工作)
  • open()目標文件寫
  • lseek()到正確的位置
  • read()的部分,以保持
  • write()到目標文件
  • 重複最後3個操作直到完成。

請注意,您在FILE*呼籲lseek()這是正確的方式(請檢查您的編譯器警告。您應該使用fseek()

另一種方式是mmap()文件和讀取的部分就好像它是一個數組。

最後,如果你的文件是一個簡單的字符串,最簡單的方法可能是在內存中讀取它,正確的文件拷貝到輸出文件。

0

最簡單的就是在一次I/O調用時使用字符。一定要使用緩衝I/O流(和使用setvbuf用來()),以避免非常糟糕的表現

FILE *f, *fout; 
f = fopen(...); 
foutp = fopen(...); 

int i = 3, c, ii; 

for (ii = 1; c = (getc(f)) != EOF; ++ii) 
{ 
    if (ii % i == 0) 
    { 
    putc(outf); 
    } 
} 
fclose(f); 
fclose(fout); 

當然,你可能需要刪除原始文件和輸出後重命名回原來的文件名你已經複製了每第三個字符。

ADDED

我還要補充一點,這個答案是寫你的問題,但它有奇怪的行爲,如果處理文本文件,因爲它會忽略當時的行分隔符的一部分,但因爲你指定的每3字節,這是誰應該表現的。如果您想始終保留行分隔符,則一次使用該行更簡單I/O功能

2

流版本可能是更好的解決方案。然後讓用戶使用重定向(如果需要的話,使用管道,或流式傳輸到終端)。儘管如此,編寫代替putchar()當然會很容易實現。

#include <stdio.h> 

void usage(char *myname) 
{ 
    fprintf(stderr, "Usage: %s <file>\n", myname); 
} 

int main(int argc, char *argv[]) 
{ 
    FILE *fh; 
    char *fn; 
    int c; 
    int i; 
    int m = 3; 

    if (argc != 2) { 
     usage(argv[0]); 
     return 1; 
    } 
    fn = argv[1]; 

    if (!(fh = fopen(fn, "r"))) { 
     perror(fn); 
     return 2; 
    } 

    i = 0; 
    while ((c = fgetc(fh)) != EOF) 
     if ((++i % m)) 
      putchar(c); 

    return 0; 
}