ページ 1 / 1
fscanfがうまく動きません
Posted: 2017年5月28日(日) 17:26
by yg
#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:
終わり
と表示されていて原因がわかりません。どなたか教えてくれませんか?
Re: fscanfがうまく動きません
Posted: 2017年5月28日(日) 17:38
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
yg さんが書きました:
上記のようなプログラムを書いたのですが
ファイルの読み込み
読み込んだ文字を表示
memo:
終わり
と表示されていて原因がわかりません。どなたか教えてくれませんか?
現時点では難しいですね。
- 読み込んでいるtest.txtの内容は何ですか?
- fscanfの戻り値はどうなっていますか?
Re: fscanfがうまく動きません
Posted: 2017年5月28日(日) 17:47
by yg
すいませんでした
まだこの掲示板に慣れていないので
コード:
printf("ファイルの読み込み\n");
printf("fscanf戻り値:%d\n",fscanf(TEST, "%s", memo));
printf("読み込んだ文字を表示\n");
printf("memo:%s\n", memo);
printf("終わり\n");
fclose(TEST);
上記のように変更したところscanfの戻り値は-1でした
ちなみにテキストの中身は「TE」です
Re: fscanfがうまく動きません
Posted: 2017年5月28日(日) 18:52
by box
そもそも
yg さんが書きました:
コード:
for (int i = 0; i <= 19; i++)memo[i] = NULL;
memo[]を初期化しようとしているのなら、不要です。
どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
それに、char型に、(void *)型のはずのNULLを放り込んでいるのは謎です。
「余分なのはできるだけそぎ落として」所定の目的を達成する、というのがいいんじゃないでしょうか。
Re: fscanfがうまく動きません
Posted: 2017年5月28日(日) 19:48
by かずま
test.txt はどこにありますか?
中身が「TE」の test.txt と、中身がない test.txt が
異なるディレクトリ(フォルダ)にあって、後者を
オープンしているのでは?
ファイル名をフルパスで指定してみるとか、
次のようなコードを fopen_s() の前に入れて、
プログラムが起動したときのカレントディレクトリを
確認してみるとかしてみてください。
コード:
char name[256];
GetCurrentDirectory(256, name); // #include <windows.h> が必要
puts(name);
Re: fscanfがうまく動きません
Posted: 2017年5月28日(日) 20:46
by みけCAT
box さんが書きました:そもそも
yg さんが書きました:
コード:
for (int i = 0; i <= 19; i++)memo[i] = NULL;
memo[]を初期化しようとしているのなら、不要です。
このプログラムでは不要ではありません。
box さんが書きました:どうせfscanf()の呼び出しで初期化の結果を上書きしますので。
fscanfのエラーチェックをせず、現に-1が返ってきているということは読み込めず上書きしていないということなので、
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)
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 *型とは限りません。