2017-11-13 7 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)が良好である、すなわち、行全体です。しかし、2番目の出力(%s)は行の最初のchar(ファイル内の数字です...ファイルはlatin2のtxtです)

+1

'onerow'は文字の配列ではなく、ポインタの配列です。 – Barmar

+1

あなたは 'onerow [j ++] = c;'から警告を受けていませんか? – Barmar

+0

'fgets()'を使って行を読んでみませんか? – Barmar

答えて

0

onerowを文字へのポインタの配列として宣言しました。文字を要素に直接割り当てません。

あなたはonerowを動的に成長している文字列になりたい場合は、それがポインタではなく、ポインタの配列として宣言する必要があります:あなたは以上rowsizeの文字を取得する場合

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

その後、あなたはrealloc()を呼び出す必要があります。

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

そして最後に、あなたはjから1を引くべきではありませんNULLバイトを追加するとき、それは次のようになります。

onerow[j] = '\0'; 

私はそこにすることを確実にするためにrealloc()前に、上記のテストでrowsize-1を使用nullバイトのための余裕がある(ここで別のテストをするよりも)。

+0

私は、 'c'を' char'から 'int'に変更し、' EOF'をテストすることを提案します。さもなければ、3つの改行がないファイルに対して無限ループを行います。 OPのコードは、forループの 'i <= row'のために、4行目を読み込み、それを破棄しようとします。 – MFisherKDX

関連する問題