2013-04-23 2 views
0

주어진 번호를 기반으로 텍스트 파일에서 특정 줄을 인쇄하는 함수를 작성하려고합니다. 예를 들어, 다음과 같은 파일이 포함되어 가정 해 봅시다 :텍스트 파일에서 번호가 매겨진 특정 줄을 어떻게 추출합니까? (C)

1 hello1 one 
2 hello2 two 
3 hello3 three 

주어진 번호는 기능을 출력 "hello3 세 ','3 '인 경우. 주어진 숫자가 '1'이면 함수 출력은 'hello1 one'이됩니다.

나는 C에 매우 익숙하지만 여기까지는 나의 논리가있다.

내가 처음으로 상상 한 것은 파일 안에 '숫자'문자가 있어야한다는 것입니다. 그리고 뭐? 전화 번호를 기입하지 않고 라인을 작성하는 방법은 무엇입니까? 어떻게 '숫자'를 찾을 수 있습니까? 나는 그것이 매우 간단하다고 확신하지만 어떻게 해야할지 모른다. 여기에 지금까지 무엇을 가지고 :

void readNumberedLine(char *number) 
{ 
    int size = 1024; 
    char *buffer = malloc(size); 
    char *line; 
    FILE *fp; 
    fp = fopen("xxxxx.txt", "r"); 
    while(fp != NULL && fgets(buffer, sizeof(buffer), fp) != NULL) 
    { 
     if(line = strstr(buffer, number)) 
     //here is where I am confused as to what to do.   
    } 
    if (fp != NULL) 
    { 
      fclose(fp); 
    } 
} 

어떤 도움을 전혀 크게 감상 할 수있다.

+0

문제 정의에 따르면, 나는 당신이 내용에 관계없이 3 행을 원한다고 생각했습니다. 그러나 솔루션은 "3"을 포함하는 행을 찾은 것 같습니다. 어느 쪽이 원하는거야? – Arun

+0

@Arun, 나는 그가 3 행을 원한다고 생각하지만, 그는 그 목표를 달성하기 위해 예기치 않은 결과를 가진 코드를 작성했다. – MYMNeo

+0

죄송합니다, 매개 변수가 '1'이면 "hello1 one"등이됩니다. 매개 변수가 '2'이면 "2"다음에 같은 행의 내용이 인쇄됩니다. –

답변

2

줄의 시작 부분에 번호가 표시된 줄을 찾고 있다고 말하는 것에서부터 말입니다. 이 경우에 당신은 당신이 다음 태그 접두사

bool readTaggedLine(char* filename, char* tag, char* result) 
{ 
    FILE *f; 
    f = fopen(filename, "r"); 
    if(f == NULL) return false; 
    while(fgets(result, 1024, f)) 
    { 
     if(strncmp(tag, result, strlen(tag))==0) 
     { 
      strcpy(result, result+strlen(tag)+1); 
      return true; 
     } 
    } 
    return false; 
} 

로 라인을 읽어 나는 다음을 시도 할 것

char result[3000]; 
if(readTaggedLine("blah.txt", "3", result)) 
{ 
    printf("%s\r\n", result); 
} 
else 
{ 
    printf("Could not find the desired line\r\n"); 
} 
+0

그건 정말 똑똑 하네, 나는 부울 함수를 통합하는 것조차 생각조차하지 않았다. 또한 strncmp()를 사용하는 것처럼 훨씬 간단합니다. 고맙습니다! –

+0

나는 특히 메모리 할당과 관련된 것들을 전달하는 것을 선호한다. 나는 버퍼를 전달하는 것을 선호한다. 그래서 당신은 원하는대로 malloc이나 정적 메모리와 함께 사용할 수있다. –

0

읽은 행의 수를 기록하는 데 도움이되는 추가 값을 사용할 수 있습니다. while에서 입력 값과 루프 값을 비교하고 동일하면 buffer을 출력하십시오.

1

처럼 사용할 수있는 무언가를 원한다.

접근법 1 :

Read and throw away (n - 1) lines 
// Consider using readline(), see reference below 
line = readline() // one more time 
return line 

접근법 2 :

Read block by block and count carriage-return characters (e.g. '\n'). 
Keep reading and throwing away for the first (n - 1) '\n's 
Read characters till next '\n' and accumulate them into line 
return line 

의 readline() Reading one line at a time in C

P.S. 다음은 쉘 솔루션이며, C 프로그램을 단위 테스트하는 데 사용될 수 있습니다.

// Display 42nd line of file foo 
$ head --lines 42 foo | tail -1 
// (head displays lines 1-42, and tail displays the last of them) 
+0

나는 접근법 2와 함께 갈 것이지만 나는 그것이 정말로 지루하다는 것에 동의 할 것이라고 확신한다. 의견을 보내 주셔서 감사합니다.이 문제를 해결할 수있는 많은 방법이 있습니다. –

+0

문제 정의가 혼란 스럽습니다 .--) 나는 질문 섹션의 질문 섹션에서 묻는 것으로 명확히하려고했지만 분명히 실패했습니다! – Arun

관련 문제