[英]overwriting lines in file in C, strange output
我正在嘗試逐行瀏覽文件(每行不超過 50 個字符),將每個字符移動 10 或 -10(以加密和解密),然后在舊字符串所在的位置打印移動后的字符串。 但我得到了一些非常有趣的輸出。
繼承人的代碼:
#include <stdio.h>
int main(void){
FILE *fp;
fp=fopen("tester.csv","r+");
Encrypt(fp); // I call decrypt here when I test it.
fclose(fp);
}
int Encrypt(FILE *fp){
int offset=10;
Shift(fp, offset);
}
int Decrypt(FILE *fp){
int offset= -10;
Shift(fp, offset);
}
int Shift(FILE *fp, int offset){
char line[50],tmp[50], character;
long position;
int i;
position = ftell(fp);
while(fgets(line,50,fp) != NULL){
for(i=0;i<50;i++){
character = line[i];
character = (character+offset)%256;
tmp[i] = character;
}
fseek(fp,position,SEEK_SET);
fputs(tmp, fp);
position = ftell(fp);
}
}
所以如果 tester.csv 最初讀取
this, is, a, test
運行程序產生
~rs}6*s}6*k6*~o}~
êñv[ ‰
this, is, a, test
fputs(tmp, fp);
fputs
寫入字節直到終止的 0 字節。
while(fgets(line,50,fp) != NULL){
for(i=0;i<50;i++){
character = line[i];
character += offset;
tmp[i] = character;
}
您移動 50 個char
,無論您讀入的行有多長,因此大多數情況下, tmp
緩沖區中沒有 0 字節,因此fputs
經常寫入至少 50 個字節,其中一些什么都沒有處理該位置文件中的內容以及緩沖區之外的內容,這會調用未定義的行為並可能導致崩潰。
您應該檢查循環中的終止 0 字節,甚至可能在換行符處停止也是一個好主意。
while(fgets(line,50,fp) != NULL){
for(i = 0; i < 50 && line[i] != 0 && line[i] != '\n'; i++){
character = line[i];
character += offset;
tmp[i] = character;
}
注意:循環體更簡單的是line[i] += offset;
.
在加密時嘗試使用 GDB 調試您的程序。
編譯: gcc -g -Wall YOURPROGRAM.cxx
運行 gdb: gdb YOURPROGRAM.cxx
設置斷點:
在第 3 行中斷: break 3
調試你的程序: run
您可以使用step
和next
步執行每行代碼,並使用print VARIABLENAME
打印出每個點的print VARIABLENAME
。 這是一個功能強大的程序,對調試非常有幫助。
您可能不應該使用面向行的fgets()
和fputs()
因為您可能會在加密的輸出數據和解密的輸入數據中獲得 NUL '\\0'
字符(換行符將為 。使用fread()
和fwrite()
。確保您也處理了正確數量的字符; fgets()
可能不會返回 49 個字符和一個 NUL;該行可能更短,而且您無論如何都不想處理 NUL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.