2014-10-23 5 views
-4

파일에서 데이터를 읽는 기능을 구현하고 싶습니다. fscanf를 통해 데이터를 읽을 수 있지만 문제는 선의 길이가 선마다 다르다는 것과 문제를 모두 저장해야한다는 것입니다.C에서 파일에서 입력 (가변 길이) 입력

numberOfStates state1 state2 ... numberOfAlphabts alphabt1 ... transitiontable 

이것이 의미하는 것은 numberOfStates가 이후 얼마나 많은 stateX 결정한다는 것입니다 : 파일의 형식은 다음과 같습니다. 만약 5가 그렇다면 우리는 0 1 2 3 4를 가지고 있고, 그 다음에 2라면 우리는 0 1을 가질 것이고 numberOfAlphabets와 같은 경우를 가질 것입니다. 그것이 2라면 우리는 그 다음에 b가 있다고 말할 수 있습니다. 그것이 5라면 우리는 그 줄에서 그 뒤에 b c d e를 가지고 있습니다. 또한 또 다른 문제가 있습니다 : transitiontable은 상태와 알파벳의 모든 조합을 저장하는 배열입니다.

a0 a1 

b0 b1 

사람이를 구현하는 방법에 나를 인도 할 수 예를 들어 두 개의 상태 0 1, 2 개 개의 알파벳 A B 다음 transtiontable는 것이 있다면? 데이터가 STDIN에서 읽었고 파일이 아닌 경우 이미 구현했습니다. 하지만 fscanf 내부의 전환 테이블을 초기화하는 방법에 대해선 머리 숙여 질 수 없습니다.

+0

STDIN에서 작동하고'scanf()'를 사용했다면'fscanf()'를 사용하도록 수정하십시오. 'gets()'를 사용했다면'fgets()'로 이동하십시오. –

+0

@WeatherVane 문제는 fscanf (traceFile, "% c", variable)와 같은 형식입니다. 변수가 transitiontable이라면 어떻게해야합니까? 전이 테이블의 크기는 같은 줄에서 읽힐 숫자와 숫자의 숫자에 달려 있습니다! 나는 그것을 초기화 할 수 없다! – aaa

+0

'fgets()'를 사용하여 파일을 읽습니다. – user1336087

답변

2

크기에 관계없이 각 행을 읽는 간단한 프로그램입니다. 당신이 그것을 유지하려는 경우

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


int read_data(){ 

    char *line = NULL; 
    size_t len = 0; 
    char read; 
    FILE *fp = fopen("data.txt" , "r") ; 
    if (!fp) { 
     printf("No such file or directory.\n"); 
     return -1 ; 
    } 
    while (read = getline(&line , &len, fp) != -1) printf("%s", line); 
    if (line) free(line) ; 
    return 0 ; 
} 

그때부터 당신은 배열에 라인를 저장할 수에. 그런 다음 문제를 해결하기 위해 문자열 분석 (C 언어에서는 어수선한 것일 수도 있음)을 수행하고 데이터를 라인에서 가져와야합니다.

+0

'getline()'이 내 C 라이브러리 (MS Visual C 2010)에 없습니다. –

+0

http://stackoverflow.com/questions/13112784/undefined-reference-to-getline-in-c – billpcs

+0

@DoomProg getline을 사용한다고 가정합니다. 선의 길이를 어떻게 알 수 있습니까? 얼마나 많은 문자를 읽습니까? 문제는 내가 각 줄의 길이를 모른다는 것입니다. 줄마다 달라집니다. – aaa