fscanfがうまく動きません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yg

fscanfがうまく動きません

#1

投稿記事 by yg » 8年前

#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:
終わり

と表示されていて原因がわかりません。どなたか教えてくれませんか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: fscanfがうまく動きません

#2

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
yg さんが書きました: 上記のようなプログラムを書いたのですが

ファイルの読み込み
読み込んだ文字を表示
memo:
終わり

と表示されていて原因がわかりません。どなたか教えてくれませんか?
現時点では難しいですね。
  • 読み込んでいるtest.txtの内容は何ですか?
  • fscanfの戻り値はどうなっていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yg

Re: fscanfがうまく動きません

#3

投稿記事 by yg » 8年前

すいませんでした
まだこの掲示板に慣れていないので

コード:

	printf("ファイルの読み込み\n");
	printf("fscanf戻り値:%d\n",fscanf(TEST, "%s", memo));
	printf("読み込んだ文字を表示\n");
	printf("memo:%s\n", memo);
	printf("終わり\n");
	fclose(TEST);
上記のように変更したところscanfの戻り値は-1でした
ちなみにテキストの中身は「TE」です

box
記事: 2002
登録日時: 14年前

Re: fscanfがうまく動きません

#4

投稿記事 by box » 8年前

そもそも
yg さんが書きました:

コード:

	for (int i = 0; i <= 19; i++)memo[i] = NULL;
memo[]を初期化しようとしているのなら、不要です。
どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
「余分なのはできるだけそぎ落として」所定の目的を達成する、というのがいいんじゃないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: fscanfがうまく動きません

#5

投稿記事 by かずま » 8年前

test.txt はどこにありますか?
中身が「TE」の test.txt と、中身がない test.txt が
異なるディレクトリ(フォルダ)にあって、後者を
オープンしているのでは?

ファイル名をフルパスで指定してみるとか、
次のようなコードを fopen_s() の前に入れて、
プログラムが起動したときのカレントディレクトリを
確認してみるとかしてみてください。

コード:

    char name[256];
    GetCurrentDirectory(256, name);  // #include <windows.h> が必要
    puts(name);

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: fscanfがうまく動きません

#6

投稿記事 by みけCAT » 8年前

box さんが書きました:そもそも
yg さんが書きました:

コード:

	for (int i = 0; i <= 19; i++)memo[i] = NULL;
memo[]を初期化しようとしているのなら、不要です。
このプログラムでは不要ではありません。
box さんが書きました:どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
fscanfのエラーチェックをせず、現に-1が返ってきているということは読み込めず上書きしていないということなので、
printfで未初期化の自動変数の値を使って未定義動作を出さないために初期化は必要です。
box さんが書きました:それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
それはそうですね。
for文を使わずに、

コード:

char memo[20] = "";
でいいでしょう。
ただし、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)
66) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.
N1570 7.19 Common definitions <stddef.h>より引用
NULL
which expands to an implementation-defined null pointer constant
NULLは値0の整数の可能性があり、void *型とは限りません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る