2016-06-25 2 views
0

2 개의 텍스트 파일을 비교하고 첫 번째 줄을 인쇄하려고합니다.하지만 fgets() 명령에서 500 버퍼를 사용하고 있습니다. 공간을 낭비하는 것 같습니다. 줄의 길이를 모르는 경우 어떻게 동일한 프로그램을 만들 수 있습니까?두 개의 txt 파일을 C로 비교합니다.

여기 내 코드입니다 :

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

int main(int argc, char const *argv[]) 
{ 
    FILE *fp1, *fp2; 

    int nLine = 1; 
    char l1[500], l2[500]; 

    system("clear"); 

    if (argc < 3) 
    { 
     printf("Usage: %s <file1.txt> <file2.txt>\n",argv[0]); 
     exit(1); 
    } 

    if ((fp1 = fopen(argv[1],"r")) == NULL){ 
     printf("Can't open file: %s\n", argv[1]); 
     exit(1); 
    } 

    if ((fp2 = fopen(argv[2],"r")) == NULL){ 
     printf("Can't open file: %s\n", argv[2]); 
     exit(1); 
    } 

    fgets(l1,500,fp1); 
    fgets(l2,500,fp2); 

    while ((l1 != 0) && (l2 != 0)){ 
     if(strcmp(l1,l2) != 0){ 
      printf("Line number: %d\n", nLine); 
      printf("%s", l1); 
      printf("%s\n", l2); 
      exit(1); 
     } else { 
      fgets(l1,500,fp1); 
      fgets(l2,500,fp2); 
      nLine++;  
     } 
    } 

    return 0; 
} 
+0

을 파일하지 않으면 당신은 무한 루프를가집니다. 'fgets()'의 반환 값을 확인하십시오. – chux

+0

char가 다른 경우 두 파일의 문자를 비교 한 다음 줄을 인쇄하는 함수를 호출 할 수 있습니다. 우리가이 선을 따르지 않았기 때문에 이것은 까다로울 수 있습니다. 개행 문자가 생길 때까지 역 추적 할 수 있습니다. 그 다음 줄을 인쇄하십시오. –

+1

목표를 달성하기 위해 버퍼가 필요하지 않습니다. 나는 비행 중 특파원의 캐릭터를 비교하고 그 과정에서 마주 친 가장 최근의 개행 캐릭터를 기억한다. – mw215

답변

2

는 "폐기물 공간이"데이터가 파일 메모리에 기억하고 싶지 않은 경우. 시간에 1 문자를 읽으십시오. 차이점을 발견하면 이전 줄 바꿈 위치에 을 찾아 다음 줄을보고하십시오.

long index = 0; 
long index_lf = 0; 
int c1,c2; 

// read until a difference or done 
while ((c1 = fgetc(fp1)) == (c2 = fgetc(fp2)) && (c1 != EOF)) { 
    index++; 
    if (c1 == '\n') index_lf = index; 
} 
if (c1 == c2) { 
    puts("same"); 
} else { 
    puts("differ"); 
    fseek(fp1, index_lf, SEEK_SET); 
    fseek(fp2, index_lf, SEEK_SET); 
    // read and print each file until a following \n or EOF occurs. 
    // TBD code for OP 
} 

[편집] 일부 개선이 다양한 문제에 대처하기 위해 : 잘못된 경기를 마지막 바이트에 파일을 다른 모드, 오류 처리에 오픈 등

long offset1 = ftell(fp1);; 
long offset2 = ftell(fp2);; 
int c1,c2; 

// read until a difference or done 
while ((c1 = fgetc(fp1)) == (c2 = fgetc(fp2)) && (c1 != EOF)) { 
    if (c1 == '\n') { 
    offset1 = ftell(fp1); 
    offset2 = ftell(fp2); 
    } 
} 

if (offset1 == -1 || offset2 == -1 || ferror(fp1) || ferror(fp2)) { 
    puts("problem"); 
} else if (c1 == c2) { 
    puts("same"); 
} else { 
    puts("differ"); 
    fseek(fp1, offset1, SEEK_SET); 
    fseek(fp2, offset2, SEEK_SET); 
    // read and print each file until a following \n or EOF occurs. 
    // TBD code for OP 
} 
+1

'if (c1 == EOF && c2 == EOF)'조건은'if (c1 == c2)'로 단축 될 수 있습니까? –

+0

@Chrono Kitsune 네, 그럴 수 있습니다 - 아주 좋습니다. – chux

관련 문제