2016-06-20 3 views
-20

テキストファイルの内容を読み取る簡単なプログラムを作成し、cl.exe(Visual Studioコンパイラ)でコンパイルしました。プログラムはコンパイルし、私はそれを実行すると、それが正常に起動し、それはそれは残酷にクラッシュし、データの読み取りや印刷を過ぎて行く瞬間...ここでは、コードです:fscanfを使用してファイルからデータを読み込んだ後にプログラムがクラッシュする

#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <math.h> 
#include <fstream> 
#include <string> 


int main (int argc, char *argv[]) 
{ 
char filename[256]; 
char d1[9]; 
char d2[8]; 

if (argc > 1) //lecture de l'argument 
strcpy(filename, argv[1]); 
    else { 
     printf("Usage: read_file"); 
     return 0; 
    } 

FILE *f = fopen(filename, "r"); 
if (f == NULL) { 
    printf("Cannot find file \'%s\'\n", filename); 
    return 0; 
} 

printf("file opened\n"); 

rewind(f); 
fscanf(f, "%s %s", d1, d2); 

printf("%s %s",d1,d2); 
fclose(f); 

return 1; 
} 

私はgccで、それをそれをコンパイルしかし、うまく動作します。事は...私はVisual Studioのコンパイラで実行するために、これを必要とする、すべての

+2

ファイルの内容は何ですか?あなたが読んだ文字列がそれぞれ*** 8 ***と*** 7 ***文字よりも長い場合はどうなると思いますか? (上記のサイズは、配列内の文字列ターミネータのスペースを残すことに注意してください) –

+20

少しアドバイス:**決して**コンパイラを責めません。私は自分のエラーは数え切れないほどですが、私の生涯ではおそらく5つの実際のコンパイラのバグを発見しました。 –

+0

バグはVisual Studioではなくコード内にあります。あなたの 'fscanf'呼び出しは、任意の長さの文字列を考慮しません。あなたがコントロールできないものは使用しないでください。 [tag:c]タグとCコードを削除してください。 – IInspectable

答えて

6

まず、あなたが他の人がD1述べたとd2が小さすぎると、とにかく...

をご入力の例を掲載している必要がありますC-Nullターミネータを格納していません。ちょうどそれらを大きくする(d1 [10]、d2 [9])。

最後に、C++でプログラミングしているので、私はC++ライブラリの使用をお勧めします。あなたのコードはよりシンプルになり、cとC++を混在させることはありません。

よろしくお願いいたします。

関連する問題