2017-09-14 2 views
0

私はCを新しくしており、割り当てを完了しようとしています。プログラムは、コマンドライン引数としてファイル名をとり、ファイルの内容を出力する必要があります。私のプログラムは、ファイル内の実際のテキストの代わりに混乱したテキストを印刷します。テキストファイルの文字を配列に追加する

私はインターネット上ですべての例を探しています/私の問題への答えとスタックしたままに!

私は間違っていますか?それが助けられる場合は、新しいコードを書くのではなく、自分のコードを修正して、わかりやすいようにしてください。

int main() 
{ 
    char fileName[20]; 
    int *buffer; 
    int size; 

    // ask for file name and take input. 
    printf("Enter file name: ");    
    scanf("%s", fileName); 

    // open file in read mode. 
    FILE *fp; 
    fp = fopen(fileName, "r");   

    // If no file, show error. 
    if(fp == NULL)     
    { 
     printf("Error: Can't open file.\n");   
     return 1; 
    } 

    // count characters in file with fseek and put into size, then move the 
    // position of the file back to the beginning. 
    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    rewind(fp); 

    // allocate buffer and read file into buffer. 
    buffer = malloc(size+1); 
    fread(buffer, 1, size, fp); 

    // close the file. 
    fclose(fp); 

    // for loop reading array one character at a time. 
    for(int x = 0; x < size; x++) 
    {    
     printf("%c", buffer[x]); 
    } 

    return 0; 
} 
+1

バッファオーバーフローには常に注意してください。 20文字のバッファーが狂っている。コンパイルされたコードで異常が発生している場合は、デバッガ*を開きます。 – tadman

+2

'int * buffer' - >' char * buffer' –

+0

答えて

2

あなたがint *bufferを使用する、すなわち、文字に読み込むための間違ったデータ型を使用しているが、あなたはchar *bufferを使用する必要があります。 を使用する場合、printf("%c",buffer[x])のようなアクセスでは、整数の配列としてバッファにアクセスしますが、を使用すると、printf("%c",buffer[x])のようなアクセスが整数の配列としてバッファにアクセスします。整数はおそらくサイズ4で、buffer[1]はバッファの4番目のバイトを、buffer[2]は8番目のバイトをアドレス指定します。したがって、ファイルに含まれていない要素を読み込み、実際には配列の境界を超えますごみやその他のものにつながる)。

関連する問題