2016-08-10 2 views
-1

PPM 파일에서 2 차원 픽셀 배열을 입력 할 때 너비와 길이가 5 인 것을 테스트하고 있습니다. 또한 ppm 파일에서 rgb는 3 가지 색상 값을 가지고 있습니다. 이 코드를 작성하기 전에이 코드를 잊어 버렸지 만 문제는 여전히 업데이트 된 상태로 유지되며 문제는 여전히 같은 방식으로 존재합니다. 문제를 격리시키기 위해 배열에 문제를 단순화했습니다. 내가 말할 수있는 것에서는 문자를 삭제하고 일부는 새로운 줄 문자로 대체하는 것 같습니다. 왜 이런 일이 일어나고 있는지에 대한 통찰력은 크게 감사 할 것입니다. 만약 내가 뭔가를 추가하는 것을 잊어 버리면, 내가 알고있는대로 바로 이것을 업데이트 할 것입니다. 내가 사용하고fetchc for 루프를 사용하여 2D 픽셀 맵을 읽을 때

#include <stdio.h> 

int main(int args, char *argv[]) { 
    int w = 5, h = 5; 

    FILE *f = fopen(argv[1], "rb"); 
    int c = 'a';//I am setting this so as to avoid the off chance of c being defined as EOF 
    for(int i = 0; i < h && c != EOF; i++) { 
     for(int j = 0; j < w && (c = fgetc(f)) != EOF; j++) printf("%c", c); 
     fgetc(f);//To remove the '\n' character I am not using fgets because it stops at '\n' character and it is possible for a rgb value to be == to '\n' 
     printf("\n"); 
    } 
    fclose(f); 
    return 0; 
} 

테스트 파일 :

12345 
abcde 
12345 
abcde 
12345 

출력 내가 점점 오전 : 사전에

12345 

abcd 

123 
5 
ab 
de 
1 

감사합니다!

편집 :이 10 명령 프롬프트 창에서 실행되는

+1

나는 이것이 Windows 머신에있을 거라고 생각 하나? 또는 최소한 입력 파일에 crlf 행 끝이 있습니다. –

+0

그래, '누락'문자가 각 행의 한 위치 뒤로 이동했기 때문에 여분의'fgetc '이 그것을 버리고 있음을 의미합니다. – kdopen

+0

사실, 바이너리 모드로 열어도 파일이 실제로 Windows 줄 끝이있는 텍스트 파일 인 것처럼 보입니다. 힌트, 디버거 사용, 문자 자체 대신 ASCII 값 읽기, 한 줄에 너무 많은 것들을 쌓아 두지 않기 때문에 디버그하기가 쉽습니다. – hyde

답변

0

Windows 시스템에 '\ n을'은 실제로 두 문자, 캐리지 리턴 (ASCII 코드 13)과 라인 피드를 생산하는 최대 끝나는 문제는 (ASCII 코드 10). 바이너리 모드에서 파일을 열면 해당 줄 끝은 다시 단일 문자로 변환되지 않습니다. 당신은이 문자들 중 하나에 대해서만 설명합니다, 그래서 당신은 당신이 읽는 각 줄의 문자로 내리고 있습니다.

설명하기 위해 printf("%c", c);"printf("%d ", c);으로 바꿉니다. 다음 출력을 얻었습니다 :

49 50 51 52 53 
10 97 98 99 100 
13 10 49 50 51 
53 13 10 97 98 
100 101 13 10 49 

이 10과 13을 통해 이동하는 것을 볼 수 있습니다.

이제 줄 바꿈을 먹으려면 두 번째 fgetc(f);을 추가하면 더 잘 작동합니다. 그러나 CRLF 줄 끝이있는 파일에서만 작동한다는 점에 유의하십시오. Linux 또는 Mac으로 포팅하면 더 많은 문제가 발생합니다.

관련 문제