2011-03-18 16 views
3

나는 단순히 탭으로 구분 된 정수 파일 (.txt 파일)을 가지고 있으며 한 줄에 한 줄씩 C로 그 파일을 읽으 려합니다. 따라서 각 줄마다 5 개의 정수가 있다고 가정합니다. 이것을 어떻게 할 수 있습니까?C에서 탭으로 구분 된 정수의 텍스트 파일을 읽는 방법은 무엇입니까?

첫 번째 시도는 다음과 같습니다.

FILE *fp; 
    char blah[255]; 
    int *some_int; 
fp = fopen("test.txt", "rt"); 
while (fgets(blah, 255, fp) != NULL) 
{ 
    sscanf(blah, "%d", some_int); 
    printf("%d\n", *some_int); 
} 
+0

초기 시도로 업데이트하겠습니다. – soxarered

+1

'some_int'는 기본이 아닌 포인터입니다. 왜 some_int는'int *'타입을 가졌습니까? 어떤 이유. – Mahesh

+0

각 줄의 자릿수가 같은가요? 그렇다면이 숫자는 컴파일 타임 상수 또는 런타임 값입니까? –

답변

3

여기 그래서 당신은 제정신 오류 처리를 가질 수 fscanf를 사용하지 않는 다른 사람이 제안하지 않는 방법이다 변환을 수행하기 위해 호출 한 함수 (아마도)를 사용하십시오 : strtol. *scanf은 형식 문자열과 일치하도록 문자열을 통과하지만 함수 호출 사이에 "저장 위치"를 허용하지 않습니다. strtol은 임의의 수의 정수를 읽어야합니다.

모든 코드를 작성하지 않았습니다. 오류 처리를해야합니다. 가능한 오류는 다음과 같습니다 당신이 reallocdata 더 크게 만들려고 할 수있는 경우에

  1. 을. 또는 버퍼를 반복하고 사전에 몇 개의 숫자가 있는지 계산할 수 있습니다. 그런 다음 많은 수를 할당하여 나중에 다시 할당 할 필요가 없습니다.
  2. fgets 전체 행을 읽지 않았습니다 ('\0' 앞에있는 마지막 문자가 '\n'임을 확인하십시오). 이 경우 버퍼를 다시 채우고 숫자를 계속 읽으려고합니다. 이 경우주의해야합니다. 다시 돌아가서 마지막 숫자를 다시 계산해야합니다. fgets가 중단되었을 수 있습니다. (이것은 fgets을 사용할 때의 단점입니다.)
  3. 잘못된 입력 - 원하는대로 처리합니다.
1

내가 같은 것을 할 것 :

int storedVals[MAX_STORED_VALS]; 
int bf; 
int ii=0; 

while (!feof(fp) && ii<MAX_STORED_VALS) { 
    if (fscanf(fp," %d",&bf)) { 
    storedVals[ii++]=bf; 
    } 
} 

가 자동으로 공백이 트리밍 않습니다 fscanf 그것은 작동하지 않았다 심지어 하나의 정수로 읽을 만했지만. 따라서 스캔 문자열에 공백이 있으면 \ t (탭) 및 \ n (개행)을 없애 다음 정수를 찾습니다. 물론, 이것은 오류 수정을 통해 많은 일을하지 않습니다. 대신에 문자를 읽어 *scanf"%d"를 사용하려고로, 기본적으로

char buffer[BUFSIZE]; 
size_t size = 5; 
int *data = malloc(size * sizeof *line); 

if(line == NULL) error(); 

while(fgets(buffer, sizeof buffer, fp) 
    { 
    size_t i = 0; 
    char *next = buffer; 
    while(*next && *next != '\n') 
     { 
     data[i++] = strtol(next, &next, 0); 
     // check for errors 
     } 
    } 

:

+0

C에서 벡터를 사용할 수 있습니까? 나는 이것들이 C++ 기능이라고 생각했다 .. – soxarered

+0

Oop. 그래, 그들은 단지 C++ 일 뿐이야. – JCooper

+0

필자는 그것을 바꿨지 만, 이제는 기대할 수있는 값의 수를 알아야하거나, 값을 저장하기 위해 자신 만의 벡터 또는 목록과 같은 데이터 구조를 만들어야합니다. – JCooper

2
#include <stdio.h> 
int main(){ 
    FILE *fp; 
    int scanned = 0; 
    int some_ints[5]; 
    fp = fopen("test.txt", "r"); 
    while ((scanned = fscanf(fp, "%d %d %d %d %d", some_ints, some_ints+1, some_ints+2, some_ints+3, some_ints+4)) != EOF) { 
     if(scanned ==5){ 
      printf("%d %d %d %d %d\n", some_ints[0], some_ints[1], some_ints[2], some_ints[3], some_ints[4]); 
     } 
     else { 
      printf("Whoops! Input format is incorrect!\n"); 
      break; 
     } 
    } 
} 
+0

OP 데이터가 파일 당 고정 된 라인 수에 있는지는 확실치 않지만 안전성과 오류 처리를 위해 OP의'fgets' /'sscanf' 조합을 선호합니다 (하지만 더 강력하게 만들어야 함). 그냥 평범한'fscanf'. 또한 파일에 숫자가 너무 적 으면 (오래된 번호를 다시 인쇄 할 때) 코드가 잘못된 결과를 생성합니다. –

+0

@Chris Lutz 입력 형식이 올바른 것으로 가정합니다. 나는 그것을 검사하여 항상 5 개의 정수를 읽었는지 확인했다. –

관련 문제