2013-09-04 5 views
0

그래서 파일을 가져 와서 문자 단위로 읽고 문자와 16 진수 값을 인쇄하는 프로그램이 있습니다. `C 프로그램 서식 지정

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
FILE *labFile; 
char buf; 

labFile = fopen("lab1.dat", "r"); 
if (labFile == NULL) perror("Error opening file\n"); 

    while((buf = fgetc(labFile)) != EOF){ 
     if(("%x", buf)< 16){ 
      printf("%c 0%x\n", buf, buf); 
     } 
     else 
      printf("%c %x\n", buf, buf); 
    } 
    fclose(labFile); 
    return 0; 
} 

` 이 프로그램은 내가 한 가지를 제외하고 그것을 필요로하는 방식으로 작동합니다. 숫자 위에 직접 16 진수를 출력하고이 과정을 수평으로 계속 진행해야하는 프로그램이 필요합니다.

도움이 될 것입니다.

+1

WTB 배열 (또는 두 개의 파일 스캔 중 하나가 작동하며'if ((""% x ", buf) <16)'로 무엇을 하려는지 잘 모릅니다. 'if (buf <16)'). – WhozCraig

+0

입력 내용을 표시 할 수 있습니까? –

답변

1

당신이해야 출력 진수로 문자 첫째, 각 당신이 화면에 열이 부족할 때까지 인쇄 된 문자를 읽어 저장합니다. 다음 줄로 이동하여 16 진수 출력 아래에 저장된 문자를 인쇄 할 수 있습니다.

논리를 단순화하여 16 진수 출력을 단일 print 문으로 형식화 할 수 있습니다.

문자를 인쇄 할 때 인쇄 할 수없는 문자를 나타내는 계획이 있어야합니다. 아래의 샘플 프로그램에서는 두 개의 연속 점을 인쇄하여 처리합니다. 각 문자가 출력 (2 진수 문자와 스페이스)에 대해 3 열 걸리므

void print_chars (unsigned char *p, int num) { 
    int i; 
    for (i = 0; i < num; ++i) { 
     printf("%s%c%s", 
      isprint(p[i]) ? " " : ".", 
      isprint(p[i]) ? p[i] : '.', 
      (i < num-1) ? " " : "\n"); 
    } 
} 

int main() { 
    FILE *labFile; 
    char buf; 
    int count = 0; 
    int num = COLUMNS/3; 
    char printed[num]; 
    labFile = fopen("lab1.dat", "r"); 
    if (labFile == NULL) perror("Error opening file\n"); 
    while((buf = fgetc(labFile)) != EOF) { 
     printf("%s%02x", count ? " " : "", buf); 
     printed[count++] = buf; 
     if (count == num) { 
     count = 0; 
     putchar('\n'); 
     print_chars(printed, num); 
     } 
    } 
    fclose(labFile); 
    if (count) { 
     putchar('\n'); 
     print_chars(printed, count); 
    } 
    return 0; 
} 

컬럼의 수는 3으로 분할된다. 열의 수를 검색하는 것은 시스템에 달려 있지만 원하는 경우 80 개를 연결할 수 있습니다.

+0

'isprint()'체크와 페이지 매김을 위해 +1. 여분의 마일가는 = P – WhozCraig

+0

또 다른 빠른 질문. 이것은 정확히 내가 원하는 것입니다. 인쇄 할 수없는 문자를 다른 표현으로 인쇄해야합니다. 탭이있을 때와 같이 표시 할 필요가 없습니다. 또한 일부 문자는 여성 및 남성 기호와 같은 특수 문자입니다 ... 오스틴 파워 같은 것. 또는 귀하의 포켓몬이 남성이거나 여성 인 경우 알려주는 캐릭터. 나는 이것에 아주 새로운이고이 프로그램에서 계속되고 있던 무슨을 이해하는 것은 나에게 오래 걸렸다. 도와 주셔서 다시 한번 감사드립니다! – ibanezshredd

+0

@ibanezshredd :이 코드는 두 개의 연속 점을 인쇄하는 것 외에 ASCII 제어 제어 문자 또는 확장 ASCII 문자를 처리하지 않습니다. 나는 너 자신을 바꾸기를 확신한다. 특수한 방식으로 인쇄하려는 문자를 테스트하고 원하는 방식으로 인쇄하려면'print_chars()'의 내부 루프에 코드를 추가하기 만하면됩니다. – jxh

0

다음과 같이 할 수 있습니다. 귀하의 전화 번호는 <이며 길이는 100 자입니다. 안전하지 않음.

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
FILE *labFile; 
char buf[100]; 

labFile = fopen("lab1.dat", "r"); 
if (labFile == NULL) perror("Error opening file\n"); 

while(fgets(buf, 100, labFile)) { 
    if(rindex(buf, '\n')) *rindex(buf, '\n') = 0; 
    int i, n = strlen(buf); 
    for(i = 0; i != n; i++) { 
     printf("0%x ", buf[i]); 
    } 
    printf("\n"); 
    for(i = 0; i != n; i++) { 
     printf("%c ", buf[i]); 
    } 
    printf("\n"); 
} 
    fclose(labFile); 
    return 0; 
}