2013-10-27 236 views
2

我想要做什麼: 從一個文件(輸入文件)讀取位,並將這些(有些概率)反轉位寫入其他文件(輸出文件)。C:同時讀取和寫入文件

問題: 概率思想似乎不能正常工作。更重要的是,輸出文件總是包含更多字符,然後是原始輸入文件,而它們應該包含相同數量的字符。

代替反轉的位我已經把「X」和「y」,因此,它更明顯的是,輸出文件包含多個字符

INPUT文件

在此代碼示例,:01001

輸出文件:xyxxxyx

代碼:

void invert_bits(FILE **input, FILE **output, double prob){ 
srand(clock()); 
char symbol; 
while((symbol = getc(*input)) != EOF){ 
    double result = rand()/RAND_MAX; 
    if(result < prob){ 
     if(simbol == '0'){ 
      char bit = 'x'; 
      fprintf(*output, &bit); 
     } 
     else{ 
      char bit = 'y'; 
      fprintf(*output, &bit); 
     } 
    }else{ 
     fprintf(*output, &symbol); 
    } 
} 

}

+0

您確定它正在寫入正確的文件嗎?您可以通過查看文件的時間戳或重命名文件來檢查,但不能更改程序。 –

+0

將'char'的地址作爲格式參數傳遞給'printf'幾乎肯定是錯誤的。可能發生的情況是,帶有'y'的局部變量存在於具有'x'的局部變量之前的內存中,並且它們後面都跟着一個'\ 0',所以無論何時您嘗試打印'y',都會打印出'yx相反。 – millimoose

+0

你不能「寫位」 - 只有字節。 –

回答

1

您沒有正確使用fprintf函數。

函數的簽名是:

INT fprintf中(FILE *流,爲const char * 格式,...);

而不是一個空的結尾的字符串,你爲它提供一個char的地址,這可能是由一個空字符跟隨,也可能不會。

印刷字符與*的printf函數的正確的方法是:

fprintf(*output, "%c", bit); 

附:爲什麼你收到一個指向文件句柄的指針,即FILE**而不僅僅是FILE*

2

(f)printf期望一個格式字符串作爲它的第二個參數。您提供的地址爲char,它甚至不是有效的字符串(因爲它不是NUL終止的)。

不要這樣做。這是一個壞習慣。當您使用printf,fprintfsprintf始終使用格式字符串。 (閱讀以獲取更多信息。)

您也可以使用fprintf(*output, "%c", bit);但它是簡單了很多,只是打印字符與fputc(bit, *output);

我不明白你爲什麼覺得有必要通過FILE*參數作爲指針,順便說一下。