#include"stdafx.h"
int main() {
FILE *TEST;
char memo[20];
for (int i = 0; i <= 19; i++)memo = NULL;
if (fopen_s(&TEST, "test.txt", "r") != 0) { printf("ファイルを開けなかった\n"); return 0; }
printf("ファイルの読み込み\n");
fscanf(TEST,"%s",memo);
printf("読み込んだ文字を表示\n");
printf("memo:%s\n", memo);
printf("終わり\n");
fclose(TEST);
return 0;
}
上記のようなプログラムを書いたのですが
ファイルの読み込み
読み込んだ文字を表示
memo:
終わり
と表示されていて原因がわかりません。どなたか教えてくれませんか?
fscanfがうまく動きません
Re: fscanfがうまく動きません
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
現時点では難しいですね。yg さんが書きました: 上記のようなプログラムを書いたのですが
ファイルの読み込み
読み込んだ文字を表示
memo:
終わり
と表示されていて原因がわかりません。どなたか教えてくれませんか?
- 読み込んでいるtest.txtの内容は何ですか?
- fscanfの戻り値はどうなっていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: fscanfがうまく動きません
そもそも
どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
「余分なのはできるだけそぎ落として」所定の目的を達成する、というのがいいんじゃないでしょうか。
memo[]を初期化しようとしているのなら、不要です。
どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
「余分なのはできるだけそぎ落として」所定の目的を達成する、というのがいいんじゃないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: fscanfがうまく動きません
このプログラムでは不要ではありません。
fscanfのエラーチェックをせず、現に-1が返ってきているということは読み込めず上書きしていないということなので、box さんが書きました:どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
printfで未初期化の自動変数の値を使って未定義動作を出さないために初期化は必要です。
それはそうですね。box さんが書きました:それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
for文を使わずに、 でいいでしょう。
ただし、C言語ではNULLはvoid *型とは限りません。
N1570 6.3.2.3 Pointersより引用
3 An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant. 66)
N1570 7.19 Common definitions <stddef.h>より引用66) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.
NULLは値0の整数の可能性があり、void *型とは限りません。NULL
which expands to an implementation-defined null pointer constant
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)