0

CodeBlocks、GCC、および C 言語を使用して書いています。私が持っているコードは次のとおりです。

char word[50];
FILE *fn;
fn = open("word.txt", "rb");
if(fn == NULL) perror("File not opened");
while(!feof(fn))
{
    fscanf(fn, "%s", word);
}

テキスト ファイルには 1 つの単語しか含まれていません (現時点では、"batman" です)。以下を含むこのコードのさまざまなバージョンを試しました。

char* word;
char = malloc(50);
FILE *fn;
fn = open("word.txt", "rb");
if(fn == NULL) perror("File not opened");
while(!feof(fn))
{
    fscanf(fn, "%s", &word);
}

正直なところ、理由はわかりませんが (なぜこれが非常に難しいのか)、CodeBlocks が私に与えているエラーは、feof 行での恐ろしい SIGSEV セグメンテーション違反です。while ループを実行しなかった場合、fscanf はセグメンテーション エラーをスローします。助けてください!私は C で作業することはあまりありませんが、その理由を今思い出しました。最も単純なことでさえ、非常に難しい場合があります。前もって感謝します。

更新:オープンラインを次のように変更することで、実際にこれを機能させました(一番上のもの)。

fn = fopen("C://Temp//word.txt", "rb");

これは相対パスでどのように機能しますか?

4

2 に答える 2

2

変化する

fn = open("word.txt", "rb");

fn = fopen("word.txt", "rb");

openintではないを返しますFILE*feof最初のパラメーターとして int ではないことをfscanf期待します。これFILE*が理由feof()であり、それを削除するとfscanf()セグメンテーション違反になります。

そして、他の人がすでに指摘したように、に変更fscanf(fn, "%s", &word)fscanf(fn, "%s", word)ます。

于 2012-11-27T22:10:26.417 に答える
1

単語が char * であると仮定すると (あなたのコードは明確ではありません)、この命令は問題を引き起こします:

fscanf(fn, "%s", &word);

次のように変更するだけです:

fscanf(fn, "%s", word);

また、fscanf は fopen によって提供される記述子で動作するため、open の代わりに fopen 関数を使用することをお勧めします。

于 2012-11-27T21:58:13.530 に答える