2012-11-16 2 views
1

파일을 한 줄씩 (각 줄은 50 자 이하) 통과하려고합니다. 각 문자를 10 또는 -10 (암호화 및 암호 해독)으로 이동하려고합니다. 그런 다음 이전 문자열이 있던 곳에 시프트 된 문자열을 인쇄하십시오. 그러나 나는 정말로 우스운 약간의 결과를 얻고있다.C의 파일에서 이상한 출력을 덮어 씁니다.

을 heres 코드 :

#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 
+2

"하지만 정말 재미 있어요. 출력 "- 더 유용하고 정확할 수 있습니다 ... –

+0

O()에서 NUL' '\ 0' '문자를 얻을 수 있기 때문에 아마도''fgets()''와''fputs 출력 데이터. 'fread()'와'fwrite()'를 사용하십시오.올바른 수의 문자도 처리해야합니다. fgets()는 49 문자와 NUL을 반환하지 않을 수 있습니다. 줄이 짧아 질 수 있습니다. –

+0

@MitchWheat 죄송합니다. 더 도움이되기를 바랍니다. – agarrow

답변

3
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들 이동하는 시간이 있었다 읽어, 따라서 대부분의 시간, 따라서 fputs 자주 쓰는 적어도 50 tmp 버퍼에 0 바이트가없는 라인 바이트 중 일부는 해당 위치에있는 파일과 관련이없고 버퍼를 넘어서서 정의되지 않은 동작을 일으키고 충돌을 일으킬 수 있습니다.

루프에서 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; 될 것이다.

2

생산은 암호화로 프로그램을 디버깅하기 위해 GDB를 사용해보십시오 .

컴파일과 : gcc -g -Wall YOURPROGRAM.cxx

실행 GDB : gdb YOURPROGRAM.cxx

중단 점 설정 : break 3

디버그 프로그램 : run

당신에게 라인 3에서

브레이크 할 수있다 stepnext을 사용하여 각 코드 행을 단계별로 실행하고 print VARIABLENAME을 사용하여 각 점에서 변수를 인쇄하십시오. 이것은 강력한 프로그램이며 디버깅에 정말로 도움이됩니다.

1
당신은 라인 지향 당신이 NUL에게 암호화의 출력 데이터 '\0' 문자를 받고, 해독의 입력 데이터 (줄 바꿈이 될 것입니다 수 있기 fgets()fputs()을. fread()fwrite()를 사용하여 사용하는 아마 안

. 확인 fgets()은 49 자와 NUL을 반환하지 않을 수 있으며, 줄이 더 짧을 수 있으며 NUL을 처리하지 않으려 고합니다.

관련 문제