2016-10-01 108 views
0

我試圖用新字符逐個交換文件中的現有字符。新字符是通過從ASCII碼中減去1來操作現有字符而獲得的。該文件已經存在與文本,但由於某種原因,我最終得到一個無限循環。我究竟做錯了什麼?C - FILE IO讀取和寫入錯誤

#include <stdio.h> 

int main() 
{ 
    FILE *fp = fopen("myfile.txt", "r+"); 

    if (fp == NULL) 
    printf("File cannot be opened."); 
    else 
    { 
    // Used for retrieving a character from file 
    int c; 

    // Pointer will automatically be incremented by one after executing fgetc function 
    while ((c = fgetc(fp)) != EOF) 
    { 
     // Decrement pointer by one to overwrite existing character 
     fseek(fp, ftell(fp)-1, SEEK_SET); 

     // Pointer should automatically increment by one after executing fputc function 
     fputc(c-1, fp); 

     printf("%c\n", c); 
    } 

    fclose(fp); 
} 

    return 0; 
} 

CNC中 我改變的C數據類型從字符爲int,但問題仍然存在。但是,我的問題已通過在fputc()調用後添加fseek(fp,0,SEEK_CUR)解決。我相信Jonathan Leffler的評論應該成爲一個答案,因爲這個問題沒有從另一個問題中得到回答。

+1

[該'fgetc'功能](http://en.cppreference.com/w/c/io/fgetc)返回一個'int'。這是有原因的。我建議你相應地改變你的變量'c'。 –

+2

當你從閱讀轉變爲寫作,以及從寫作轉變爲閱讀時,你必須定位兩者。在fputc()調用之後添加'fseek(fp,0,SEEK_CUR)'。 (爲什麼?這個標準是這麼說的!參見'fopen()'描述'+'模式:但是,輸出不應該直接跟隨輸入,而不需要對fflush函數或文件定位函數('fseek ', 'fsetpos'或'rewind'),並且輸入不應該直接跟在輸出之後,除非輸入操作遇到文件結束,否則不會對輸入文件進行中間調用 _ –

+0

哎呀,我忘了fgetc返回一個int,我把c的數據類型改爲int,但問題仍然存在,但是在fputc()調用後添加fseek(fp,0,SEEK_CUR)實際上解決了我的問題。 – Gizdich

回答

0

嘗試這種

#include <stdio.h> 

int main(void){ 
    FILE *fp = fopen("myfile.txt", "r+"); 

    if (fp == NULL) { 
     printf("File cannot be opened."); 
     return -1; 
    } 

    int c; 
    long pos = ftell(fp); 
    while ((c = fgetc(fp)) != EOF){ 
     fseek(fp, pos, SEEK_SET);//In the case of text file Do not operate the offset. 
     fputc(c-1, fp); 
     fflush(fp);//To save the output. 
     pos = ftell(fp); 

     printf("%c\n", c); 
    } 
    fclose(fp); 

    return 0; 
}