2016-09-22 56 views
1

我只想獲取文件的內容並在同一文件中對其進行加密。如何讀取,加密和覆蓋文本文件

我知道這不是最有效的加密形式,但我只是玩弄它看看代碼如何讀取文件。

Hello.txt有「abcdefg」。

但是當我通過它運行代碼時,沒有任何變化。

我在做什麼錯?

#include<stdio.h> 

int main(){ 

    FILE *fp1=NULL; 

    char ch; 

    fp1=fopen("C:\\Hello.txt","r+"); 

    if(fp1==NULL) 
    { 
     printf("fp1 NULL!\n"); 
    } 

    while(1){ 

     ch=fgetc(fp1); 

     if(ch==EOF){ 
      printf("End of File\n"); 
      break; 
     } 
     else{ 
      ch=ch*10; 
      fputc(ch,fp1); 
     } 
    } 

    fclose(fp1); 

    return 0; 
} 
+5

首先第一件事情:該'fgetc'功能(HTTP:// EN .cppreference.com/w/c/io/fgetc)會返回一個「int」。這對你的'EOF'檢查非常重要。 –

+0

此外,當用[10]乘以[ASCII字符](http://en.cppreference.com/w/c/language/ascii)時,你會怎麼想呢?什麼是例如97(「a」的ASCII值)乘以10?這個結果如何適合一個字節? –

+1

最後,當你寫入這個文件時,你認爲它會寫在哪裏?想象一個文件很像內存中的數組,文件的位置就像索引到數組中。當你從文件中讀取一個字符時,它會將文件位置增加1,因此它現在「指向」要讀取的下一個字符。如果你現在*寫*到那個位置會發生什麼? –

回答

0

約阿希姆Pileborg已經使用了評論你所犯的錯誤暗示,讓我不那麼微妙:

#include <stdio.h> 
#include <stdlib.h> 
// Cesar cipher 
int main(int argc, char **argv) 
{ 
    FILE *fp1 = NULL; 
    // we need an int to check for EOF 
    int ch; 

    fp1 = fopen("Hello.txt", "r+"); 
    if (fp1 == NULL) { 
    fprintf(stderr, "fp1 NULL!\n"); 
    exit(EXIT_FAILURE); 
    } 

    while (1) { 
    // get character (fgetc returns an int) 
    ch = fgetc(fp1); 
    if (ch == EOF) { 
     printf("End of File\n"); 
     break; 
    } else { 
     // Set file-pointer back to the position of 
     // the character just read (it is a bit more 
     // complicated internally and works only for one) 
     ungetc(ch, fp1); 
     // do decryption 
     if (argc == 2 && *argv[1] == 'd') { 
     ch = ch - 3; 
     } 
     // do encrytion (default) 
     else if (argc == 1 || (argc == 2 && *argv[1] == 'e')) { 
     ch = ch + 3; 
     } 
     // print character (fputc takes an int) 
     fputc(ch, fp1); 
    } 
    } 
    fclose(fp1); 
    exit(EXIT_SUCCESS); 
}