2013-04-21 3 views
0

텍스트 파일을 내 C 프로그램으로 리디렉션하고 있습니다.입력 리디렉션 및 되감기

./test.c < earthquakes.txt 

와 나는 내가 그렇게 같은 scanf와 함께 필요한 데이터를 읽어

while (scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f", 
    &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki, 
    &latit, &longi, &depth, &magnitude) == 13) { 
    printf("test\n"); 
    num_earthquakes++; 
} 

내가 필요한 모든 라인을 읽을 때까지. 그렇게 한 후, 나는 어떻게 표준 입력의 처음으로 되감니까?

+2

일반적으로 * stdin *을 되 감을 수 없습니다. ''의 [rewind() 함수] (http://en.wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/rewind)를 사용하고 싶지만 항상'stdin '; 일부 시스템에서는 작동하지만 대부분의 시스템에서는 실패합니다. 더 나은 실패를보고하기 때문에'fseek'를 사용하는 것을 선호 할 수 있습니다. 명령 프롬프트에서 –

+0

대신'<'을 리디렉션하십시오. 필자는 사용자 fscanf()를 사용하여 파일에서 읽을 것을 제안합니다. 'rewind()'와'fseek()'는 파일 포인터를 시작으로 이동시키는 데 사용할 수있는 두 개의 함수입니다. –

+0

좋아, 내가 옳은 것을 찾고있는 것을 100 % 할 수있는 방법이 없다. 그냥 확인해. 이것은 할당이고 우리는 * 입력 리디렉션을 사용하고 파일 포인터는 사용하지 않습니다. 아마도 한 번 읽는 것만으로도 할 수있을 것입니다. – nebffa

답변

1

아마도 하나의 패스를 만드는 것이 가장 좋은 방법입니다. 값을 읽고 필요한 경우 realloc을 사용하여 배열의 크기를 조정하십시오. 방대한 양의 입력으로 인한 오류를 최소화하려면 문제를 해결하는 데 필요한 정보 만 저장하는 것이 좋습니다. 출력이 달을 기준으로하는 경우 개월을 기준으로 정보를 수집하십시오. 예를 들어 :

size_t count = 0; 
struct month_stat *month = NULL; 
while (count <= SIZE_MAX/sizeof *month && 
     scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f", 
      &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki, 
      &latit, &longi, &depth, &magnitude) == 13) 
{ 
    /* resize based upon powers of two for simplicity */ 
    if (count & (count - 1) == 0) 
    { 
     void *temp = realloc(month, (count * 2 + 1) * sizeof *month); 
     if (temp == NULL) 
     { 
      /* handle error */ 
     } 

     month = temp; 
    } 

    /* TODO: Update month[count] and overall stats 
    *  When the month changes, you'll want to count++; 
    */ 
} 

당신은 당신이 %하고 중 형식 지정자를 사용 사이의 *을 배치하여 입력을 폐기 할 수는 scanf를 말할 수있는 것을 알고 있습니까? 예를 들어 assert(scanf("%*c") == 0);은 반환 값에 반영되는 할당없이 문자를 읽고 무시합니다.

+0

나는 더 쉬운 버전이 있었으면 좋겠어 만, 나는 realloc을 가지고 갔다. 또한 나는 scanf로 그 일을 할 수 있다는 것을 몰랐다. 유용한 팁을 얻으려면 고맙다. 그 scanf 라인은 우리에게 제공되었지만 어쨌든 나는 당신의 제안을 사용했습니다 ^^ – nebffa

2

stdin은 스트림이면서 일반 파일이 아니므로 입력을 되 감을 수 없습니다.

파일에서 정기 읽기를 사용하거나 수신 된 데이터를 버퍼에 복사하여 다시 읽으려고한다고 가정합니다.

+0

수신 한 데이터를 버퍼에 복사 하시겠습니까? "완충 대"란 무엇입니까? – nebffa

+0

@nebffa 임시 배열을 의미합니다. 그러나 일반적으로 좋지 않습니다. 제 생각에는 최선을 다하는 것이 파일을 사용하는 것입니다. – Alex

0

가능한 방법은 첫 번째 강의에서 메모리에 표현을 작성하는 것입니다. 예를 들어, 각 행에 해당하는 링크 된 목록을 만들고 그 요소는 자신의 구조체입니다.

그런 식으로 한 번 읽는 것만으로도 재미 있고 편리하게 사용할 수 있습니다.