2014-09-27 14 views
0

마지막 질문입니다. 나는 투쟁마다 한 번 이상 게시하지 않으려 고 노력한다. ...C의 입력 파일에서 특정 구문 읽기

이것은 조금 더 간단하다.

첫 번째 8 줄에 일련 번호가 배열 된 txt 파일이 있습니다. 뒤에 나오는 모든 줄에는 "BUY ITEM"이나 "AWARD ITEM"과 같은 특정 구문이 있고 정수가옵니다 (여러 구가 있지만 한 가지만 염두에두고 있습니다). 기본적으로 for 또는 while 루프를 사용하여 문서의 문구를 검색하고 문구 끝으로 포인터를 설정 한 다음 구문 오른쪽에있는 정수를 fscanf로 설정하려고합니다. 내가 가지고있는 유일한 문제는 특정 문구의 끝에 포인터를 가져 와서 그 번호를 읽는 것입니다. 문구가 다른 줄에 반복된다는 사실뿐만 아니라 한 번에 값을 모두 가져오고 싶지 않습니다.

은 내가 간단한

while (!feof(//function for reading phrase)) { 
     fscanf("%d", &value); 
     //rest of function 

을 할 수있는 확신 그리고 그렇게 될 것입니다. 하지만 난 fseek과 fget 시도하고 아무것도 정말 내가 어디로 갈 수있는 미리 설정된 위치가 필요없이 그것을 필요로하는 위치에 대한 포인터를 얻을 수있었습니다. 입력 파일은 매번 다를 것이기 때문에 나는 단지 1024 칸 아래로 내려가라고 말할 수는 없다. 이 점에 대해 어떻게 생각 하느냐는 확실하지 않습니다 ...

또한 아래는 입력 파일의 예입니다.

75 75 908 
10 10 
18 23.10 10.09 
70 5 15 
8 100 20 28.99 
30 40 50 60 
4 6 8 8 5 5 5 6 7 10 
10 
BUY ITEM 8 
BUY ITEM 10 
AWARD ITEM 7 
BUY ITEM 1 
BUY ITEM 3 
AWARD ITEM 9 
BUY ITEM 7 
RETURN ITEM 8 

누구에게 도움을 주셔서 감사합니다.

+0

지정된 파일 형식이 없으면 찾을 때까지 모든 줄을 읽어야합니다. 그것은 그 이상으로 복잡하지 않습니다. "포인터 설정"과 "숫자 읽기"보다는 전체 줄을 읽고, 일치하는 항목이 있으면 숫자를 추출하십시오. –

+0

그리고 일치하는 경우 어떻게 각 줄을 읽고 번호를 추출합니까? 그게 fseek 일종의 거래 같은데? – Darksider13

+1

아니요,'fgets()'를 사용하여 전체 줄을 얻은 다음'fscanf()'또는'strtol()'또는 그 줄을 따라 무언가를 가져 와서 번호를 가져옵니다. 파일이 항상이 형식을 따르고 행이'BUY ITEM'으로 시작하여 공백이 오는 경우, 문자열의 10 번째 문자에서 시작되는 숫자를 알 수 있습니다. –

답변

0

문제의 줄에서 파일이 같은 형식을 따른다면 그 줄의 동일한 문자에 항상 숫자가 나타날 것이라는 사실을 이용하면 쉽게 할 수 있습니다. 이것은 조금 깨지기 쉬운이며, 예를 들어 공백의 임의의 양에 대처하기 위해, 당신의 프로그램이보다 강력한 만들기 위해 더 나은 것,하지만 난 당신에게 연습으로 떠날 것이다 :

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

#define MAX_LEN 100 
#define BUY_LEN 9 
#define AWARD_LEN 11 

int main(void) { 
    FILE * infile = fopen("file.dat", "r"); 
    if (!infile) { 
     perror("couldn't open file"); 
     return EXIT_FAILURE; 
    } 

    char buffer[MAX_LEN]; 
    char * endptr; 

    while (fgets(buffer, MAX_LEN, infile)) { 
     if (!strncmp(buffer, "BUY ITEM ", BUY_LEN)) { 
      char * num_start = buffer + BUY_LEN; 
      long item = strtol(num_start, &endptr, 0); 

      if (endptr == num_start) { 
       fprintf(stderr, "Badly formed input line: %s\n", buffer); 
       return EXIT_FAILURE; 
      } 

      printf("Bought item %ld\n", item); 
     } 
     else if (!strncmp(buffer, "AWARD ITEM ", AWARD_LEN)) { 
      char * num_start = buffer + AWARD_LEN; 
      long item = strtol(num_start, &endptr, 0); 

      if (endptr == num_start) { 
       fprintf(stderr, "Badly formed input line: %s\n", buffer); 
       return EXIT_FAILURE; 
      } 

      printf("Awarded item %ld\n", item); 
     } 
    } 

    fclose(infile); 
    return 0; 
} 

귀하의 질문에 샘플 데이터 파일을 사용하여이 작업을 실행, 당신은 얻을 :

[email protected]:~/src/sandbox$ ./extr 
Bought item 8 
Bought item 10 
Awarded item 7 
Bought item 1 
Bought item 3 
Awarded item 9 
Bought item 7 
[email protected]:~/src/sandbox$ 

덧붙여, 귀하의 질문에 제안 중 하나를 기반으로, 당신은 질문 "while(!feof(file))" is always wrong에 대한 답변을 확인 할 수 있습니다.