2017-11-13 9 views
-1

파일이 더 많습니다. 이제는 char에서 char로 3 번째를 스캔하고 싶습니다. 이 노력하고 있습니다,하지만 난 첫 번째 하나 (onerow) 배열로 문자를 할당 할 수 없습니다 :C에서 fgetc를 사용하여 파일 읽기

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <time.h> 
#if defined(WIN32) || defined(_WIN32) 
    #include <windows.h> 
#endif 

int main(void) { 
#if defined(WIN32) || defined(_WIN32) //for latin2 
    SetConsoleCP(1250); 
    SetConsoleOutputCP(1250); 
#endif 
    //char* onerow=(char*) malloc(num*sizeof(char)); 
    char* onerow[250]; 
    char c; 
    int row=3, j=0; 

    FILE *fp; 
    fp = fopen("proba.txt", "r"); 

    for (int i=0; i<=row; i++) { 
     if(i!=row-1) {   //not the row we need, jump over it 
      while(c!='\n') 
       c=fgetc(fp); 
      c='a'; //to make true while next time 
     } 
     if(i==row-1) { 
      while(c!='\n') { //this is what we need 
       //onerow[j]=fgetc(fp); 
       //onerow = (char*)realloc(onerow, ++num*sizeof(char)); 
       c=fgetc(fp); 
       printf("%c", c); //this is working well (prints everyth.) 
       onerow[j++]=c; 
      } 
     } 
    } 
    onerow[j-1]='\0'; 
    fclose(fp); 
    printf("%s", onerow); //prints only the first charachter 
    //free(onerow); 
} 

먼저 출력 (% C는) 좋은, 즉 전체 행입니다. 그러나 두 번째 출력 (% s)은 행의 첫 번째 문자 (파일의 숫자 ... 파일이 latin2 txt 임)입니다.

+1

'onerow'는 문자의 배열이 아닌 포인터의 배열입니다. – Barmar

+1

'onerow [j ++] = c;'에서 경고를받지 못했습니까? – Barmar

+0

'fgets()'을 사용하여 줄을 읽지 않는 이유는 무엇입니까? – Barmar

답변

0

onerow을 문자에 대한 포인터의 배열로 선언 했으므로 문자를 요소에 직접 지정하지 마십시오. 이상의 rowsize 문자를받을 경우

size_t rowsize = 250; 
char *onerow = malloc(rowsize); 

는 그런 다음 realloc()를 호출해야합니다 :

당신이 동적으로 성장하는 문자열로 onerow를 원하는 경우에

, 그것은 포인터가 아닌 포인터의 배열로 선언해야합니다.

c = fgetc(fp); 
if (j >= rowsize-1) { 
    rowsize += 250; 
    onerow = realloc(onerow, rowsize); 
} 
onerow[j++] = c; 

그리고 널 바이트를 추가 할 때 마지막에 당신이 j에서 1 빼기 안된다, 그것은해야한다 :

onerow[j] = '\0'; 

내가 보장하기 위해 realloc() 전에 위의 테스트에서 rowsize-1 사용이 것 널 바이트 (여기에 또 다른 테스트를하기보다는)를위한 공간이되어야한다.

+0

''char''에서'int'로'c'를 바꾸고'EOF'를 테스트 할 것을 제안합니다. 그렇지 않으면 3 줄 바꿈이없는 파일에서 무한 루프가 발생합니다. OP의 코드는 for 회 돌이에서'i <= row' 때문에 4 번째 줄을 읽고 그것을 버리려고합니다. – MFisherKDX