_wfopenを用いたファイルの書き込み、読み込みについて

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

_wfopenを用いたファイルの書き込み、読み込みについて

#1

投稿記事 by bonbo » 8年前

お世話になっています。早速ですが質問させていただきます。
_wfopenを使ってfopenと同じようなことがしたいと思い、以下のようなプログラムを組んだのですが、
うまく動いてくれません。どこがおかしいのでしょうか。よろしくお願いします。

コード:

#include <stdio.h>												
#include <tchar.h>												//_wfopenを使用するため
#include <Windows.h>											//TEXTマクロが使いたかったため
int main (){
	int a;
	int tX[10];
	FILE *filehandle;
	for(int i=0;i<10;i++)										//初期化をしておく
		tX[i]=i+1;

	filehandle = _wfopen(TEXT("testfile.tst"),TEXT("wb"));		//書き込むファイルを開く
	if(filehandle==NULL){
		printf("ファイルをひらけませんでした\n");
		return -1;												//開けなかったら終了
	}
	else
		printf("ファイルをひらけました\n");

	fwrite( &tX[5] , sizeof( int ) , 1 , filehandle );			//書き込む(生成されるファイルの容量が0なのでおそらく書き込めていない)
	fclose( filehandle ) ;										//ファイルを閉じる

	for(int i=0;i<10;i++)										//配列の値をすべて0にしておく
		tX[i]=0;

	filehandle = _wfopen(TEXT("testfile.tst"),TEXT("rb"));		//再びファイルを開く
	if(filehandle==NULL){
		printf("ファイルをひらけませんでした\n");
		return -1;
	}
	else
		printf("ファイルをひらけました\n");

	fread( &tX[5] , sizeof( int ) , 1 , filehandle );			//読み込む(なぜか不定値で書き換えられている)
	fclose( filehandle ) ;

	printf("tX[5]==%d\n",&tX[5]);								//tX[5]==6となってほしい
	
	scanf("%d",&a);												//結果が見れないので一応scanfで止めてある。
	return 0;
}
環境はwindows7,VS2010です。

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

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#2

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

UNICODEマクロを定義しないと、TEXTマクロは普通のテキストになるのではないでしょうか?
TEXT("ほげ")となっているところをを全てL"ほげ"としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ホヅミ
記事: 110
登録日時: 9年前

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#3

投稿記事 by ホヅミ » 8年前

一番最後のprintfをアドレス参照をやめたらどうですかね?

bonbo

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#4

投稿記事 by bonbo » 8年前

>みけCATさん
ありがとうございます
windows.hの中でwindows.hをインクルードしてれば問題ないはずですよ

>ホヅミ
ありがとうございます、できました
なんてひどいミス…お恥ずかしい…忘れてください…

以下成功コード(&消しただけですが)

コード:

#include <stdio.h>												
#include <tchar.h>												//_wfopenを使用するため
#include <Windows.h>											//TEXTマクロが使いたかったため
int main (){
	int a;
	int tX[10];
	FILE *filehandle;
	for(int i=0;i<10;i++)										//初期化をしておく
		tX[i]=i+1;

	filehandle = _wfopen(TEXT("testfile.tst"),TEXT("wb"));		//書き込むファイルを開く
	if(filehandle==NULL){
		printf("ファイルをひらけませんでした\n");
		return -1;												//開けなかったら終了
	}
	else
		printf("ファイルをひらけました\n");

	fwrite( &tX[5] , sizeof( int ) , 1 , filehandle );			//書き込む(生成されるファイルの容量が0なのでおそらく書き込めていない)
	fclose( filehandle ) ;										//ファイルを閉じる

	for(int i=0;i<10;i++)										//配列の値をすべて0にしておく
		tX[i]=0;

	filehandle = _wfopen(TEXT("testfile.tst"),TEXT("rb"));		//再びファイルを開く
	if(filehandle==NULL){
		printf("ファイルをひらけませんでした\n");
		return -1;
	}
	else
		printf("ファイルをひらけました\n");

	fread( &tX[5] , sizeof( int ) , 1 , filehandle );			//読み込む(なぜか不定値で書き換えられている)
	fclose( filehandle ) ;

	printf("tX[5]==%d\n",tX[5]);								//tX[5]==6となってほしい
	
	scanf("%d",a);												//結果が見れないので一応scanfで止めてある。
	return 0;
}

bonbo

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#5

投稿記事 by bonbo » 8年前

さんをつけ忘れました…すみません…

bonbo

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#6

投稿記事 by bonbo » 8年前

>windows.hの中でwinndows.hをインクルード
意味不明ですね…window.hをインクルードです…何度もすみませんでした…

YuO
記事: 942
登録日時: 10年前
住所: 東京都世田谷区

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#7

投稿記事 by YuO » 8年前

bonbo さんが書きました:>みけCATさん
windows.hの中でwindows.hをインクルードしてれば問題ないはずですよ
みけCATさんの書かれたことが伝わっていないようですね……。

TEXTというマクロは,

コード:

#ifdef UNICODE
#define TEXT(v) L#v
#else
#define TEXT(v) v
#endif
という作りになっています。
つまり,UNICODEの定義の有無によってワイド文字列定数になるか標準の文字列定数になるかが決まります。
プロジェクトのプロパティで,文字セットを「Unicode 文字セットを使用する」から「マルチ バイト 文字セットを使用する」に変更してみると,エラーになるのがわかると思います。

で,_wfopenを使うのであれば,
  • <tchar.h>ではなく<wchar.h>をインクルードする
  • 引数の文字列定数は,

    コード:

    L"testfile.tst"
    のようにワイド文字列定数として記述する
のが正しいです。
<tchar.h>をインクルードしたのであれば,確かにTEXTマクロの使用は正しいですが,_wfopenではなく_tfopenを使う必要があります。
# 細かい差があったり (UNICODE→_UNICODE,TEXT→_T) しますが気にする必要は無いでしょう。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#8

投稿記事 by ISLe » 8年前

YuO さんが書きました:<tchar.h>をインクルードしたのであれば,確かにTEXTマクロの使用は正しいですが,_wfopenではなく_tfopenを使う必要があります。
# 細かい差があったり (UNICODE→_UNICODE,TEXT→_T) しますが気にする必要は無いでしょう。
気になるひとの参考になればということで。

TEXTはWindows SDKのwinnt.hで定義されていて、UNICODEによって切り替わります。
_TはCRTライブラリのtchar.hで定義されていて、_UNICODEによって切り替わります。

なので、_tfopenには_Tが組み合わせとしては正しいです。
_tfopenにTEXTだと、windows.hをインクルードしないソースファイルにコピペしたとき、TEXTが未定義のコンパイルエラーになります。

ホヅミ
記事: 110
登録日時: 9年前

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#9

投稿記事 by ホヅミ » 8年前

ついでに重箱ですが

コード:

filehandle = _wfopen(TEXT("testfile.tst"),TEXT("wb"));      //書き込むファイルを開く
↓
_wfopen_s(&filehandle,TEXT("testfile.tst"),TEXT("wb"));      //書き込むファイルを開く
にしないと警告が出るので、警告を消したい人はこう書くようにしましょう!

bonbo

Re: _wfopenを用いたファイルの書き込み、読み込みについて

#10

投稿記事 by bonbo » 8年前

>YuOさん
ありがとうごさいます
TEXTマクロの定義は知りませんでした…すみません…

#define _tfopen _wfopen
となっていたので使っていいと思ってました…
細かなルールを守れないといけませんね…ありがとうございます…
>ホヅミさん
ありがとうございます
>_tfopenにTEXTだと、windows.hをインクルードしないソースファイルにコピペしたとき、TEXTが未定義のコンパイルエラーになります。
だからいろいろな種類があったのですね…全部TEXTマクロでいいと思っていました…ありがとうございます…

閉鎖

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