2012-11-15 4 views
3

나는 매우 간단한 문제가 있습니다. 각 편지는 내가 '그래프에 정점을 나타냅니다형식화 된 파일을 C에서 char 배열로 읽음

A B 
B C 
E X 
C D 

: 나는 파일은 항상 문자의 두 컬럼으로 포맷됩니다 C에서 문자 배열, 등으로 파일의 내용에서 읽을 필요 나중에 다룰 것입니다. C++과 Java를 사용하여 프로그래밍을 배웠지 만 C에 특별히 익숙하지 않습니다.

내가 알 수없는 문제의 원인은 파일이 여러 줄로 길다는 사실입니다. 배열의 슬롯을 차지하기 위해 각 문자가 필요합니다. 따라서이 경우에는 array[0] = 'A', array[1] = 'B', array[2] = 'B', array[3] = 'C' 등이됩니다.

결국에는 중복을 포함하지 않도록 배열이 필요하지만 나중에 처리 할 수 ​​있습니다. 나는 이번 학기 초에 파일에서 int의 한 줄을 읽는 프로그램을 작성 했으므로 잘 작동 했으므로 대부분의 코드를 복사했지만이 경우에는 작동하지 않습니다. 내가 파일 열기를 테스트 할 적절하고 이것 저것 읽을 필요가 알고

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

int main (int argc, char *argv[]) 
{ 
    int i; 
    int count = 0; 
    char * vertexArray; 
    char ch = '\0'; 

// open file 
    FILE *file = fopen(argv[1], "r"); 

// count number of lines in file 
    while ((ch=fgetc(file)) != EOF) 
     if(ch == '\n') count++; 

// numbers of vertices is twice the number of lines 
    int size = count*2; 

// declare vertex array 
    vertexArray = (char*) calloc(size, sizeof(char)); 

// read in the file to the array 
    for(i=0; i<size; i++) 
     fscanf(file, "%c", &vertexArray[i]); 

// print the array 
    for(i=0; i<size; i++) 
     printf("%c\n", vertexArray[i]); 

    fclose(file); 
} 

하지만 나중에 그에 추가 할 것입니다 : 여기에 지금까지 무슨이다. 배열을 지금 당장 읽으려고합니다. 이 경우 내 출력은 8 개의 빈 줄입니다. 어떤 도움이라도 좋을 것입니다!

답변

1

줄 수를 계산하기 위해 파일을 루프 할 때 파일 포인터는 이미 EOF에 있으므로 배열에 아무 것도 읽지 않습니다. 기껏해야 마지막 캐릭터와 동일한 가치를 갖지만 세분화 오류가 표시됩니다. 당신

//read file into the array 

는 다음 파일의 시작 부분에서 시작됩니다 전에 당신이 원하는 무엇

rewind(file); 

입니다. 또한, 나는 보통 후행 '\0' 거기에 앉아 있기 때문에 fgetc이 줄 끝을 처리하는 방법을 모르겠습니다. 당신이 할 수있는 또 다른 방법은 EOF 플래그가 설정되어있는 경우는 너무

i = 0; 
while (!feof(file)){ 
    fscanf(file, "%c %c", &vertexArray[i], &vertexArray[i+1]); 
    i++; 
} 

기능처럼 feof(FILE *) 검사를 fscanf을 사용하는 것입니다, 당신은 EOF 충돌 후 정지합니다.

업데이트 :chint ch으로 정의하면 제대로 작동한다고 생각합니다. this 스레드를 살펴보십시오.

int main (int argc, char *argv[]) 
{ 
    int i; 
    int count = 0; 
    char * vertexArray; 
    int ch, size; 

    FILE *file; 
    file = fopen(argv[1], "r"); 

    while ((ch = fgetc(file) != EOF)) 
     count++; 

    size = count*2; 
    vertexArray = (char*) calloc(size, sizeof(char)); 
    rewind(file); 

    for(i=0; i<size; i++) 
     fscanf(file, "%c ", &vertexArray[i]); 

    for(i=0; i<size; i++) 
     fprintf(stderr, "%c\n", vertexArray[i]); 

    fclose(file); 

}

NEW EDIT 공지 사항 fscanf(file, "%c ", &vertexArray[i]); 후 공간 :

은 나를 위해 일한 코드입니다. 그러면 문자를 읽은 후 모든 공백을 건너 뛰고 싶다고 C에게 알립니다. 공간이 없으면 공백 문자도 문자로 읽습니다. 이것은 그것을 고쳐야한다.

+0

귀하의 제안이 보인다,하지만 난 그것을하려고 할 때 세그먼트 오류를 ​​얻을. 되감기 (파일)와 관련이있는 것 같습니다. 나는 또한 fseek (file, 0, SEEK_SET)하지만 똑같은 시도를했다. 왜 내가 이걸 얻었는지 알 수가 없어. – DaBurto

+0

죄송합니다. 실제로 작동하는지 알려 드리지 않고 말씀 드렸습니다. 나는 실제로 그것을 밖으로 시도하고 알려 드리겠습니다. – Kitchi

+0

어떤 이유로 여분의 줄을 읽는 것 같습니다. 이 코드로 my count = 20 making size = 40, 여기서 그들은 4와 8 (또는 NULL 터미네이터를 포함 할 것인가? – DaBurto

0

fgetc 파일 위치 표시기를 진행하십시오. 현재 코드를 사용하여 0으로 되돌아 가거나 라인 수를 신경 쓰지 않고 라인을 읽어야합니다.

0

데이터를 읽으려고하면 이미 선 계산으로 파일을 다 써 버린 것입니다. 파일을 되감거나 다시 열어야합니다.

0

당신은보고있다 fseek(file, 0, SEEK_SET);

코드를 추가해야합니다 : 그것은 작동해야처럼

//Some stuff 

// declare vertex array 
vertexArray = (char*) calloc(size, sizeof(char)); 

fseek(file, 0, SEEK_SET); 
// read in the file to the array 
    for(i=0; i<size; i++) 
     fscanf(file, "%c", &vertexArray[i]); 

//Some stuff 
관련 문제