C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 文字列をバイナリファイルに保存したい


(過去ログ 120 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■72200 / inTopicNo.1)  文字列をバイナリファイルに保存したい
  
□投稿者/ OROCHI (31回)-(2014/05/24(Sat) 21:05:47)

分類:[C/C++] 

開発環境
Windows 7
Visual Studio 2013

こんにちは、現在「文字列をバイナリファイルに保存して、それを読み出す」という機能を作ろうとしています
そこで、以下のようなソースを用意しました

#include <iostream>
#include <stdlib.h>
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{
	// 保存する文字列
	char *name = "Kaname_Madoka";
	// 保存される文字列長
	int stringsize = 13;
	// 保存するファイル名
	char *filename = "test.bin";
	// ファイルポインタ
	FILE *fp;
	// ファイルを開いて保存
	errno_t error;
	if (error = fopen_s(&fp, filename, "wb") != 0)	{
		// エラー時強制抜け
		std::cout << "file write open error!" << std::endl;
		system("PAUSE");
		return -1;
	}
	fwrite(&stringsize, sizeof(int), 1, fp);
	fwrite(&name, stringsize, 1, fp);
	// ファイルを閉じる
	fclose(fp);

	// 再度ファイルを開く
	if (error = fopen_s(&fp, filename, "rb") != 0)	{
		// エラー時強制抜け
		std::cout << "file read open error!" << std::endl;
		system("PAUSE");
		return -1;
	}
	// セーブされた文字列を表示
	int stringlength = 0;
	char loadstring[256];
	fread(&stringlength, sizeof(int), 1, fp);
	fread(&loadstring, stringlength, 1, fp);
	std::cout << loadstring << std::endl;       (A)
	// ファイルを閉じる
	fclose(fp);
	system("PAUSE");
	return 0;
}

ここで2つの問題が起きています
1.(A)の部分で、文字化けが起こる
2. セーブデータ「test.bin」に文字列「Kaname_Madoka」と保存されない(バイナリエディタで強引に見た限りでは文字列として成立していない情報が保持されています)。1の根本的な原因は多分これなんでしょうが・・・ちなみに文字列をstd::stringにしてもやはり正常にセーブされません

文字列をバイナリ形式で保存する方法をご存知の方、よろしければお知恵をお貸し願えないでしょうか?

引用返信 編集キー/
■72201 / inTopicNo.2)  Re[1]: 文字列をバイナリファイルに保存したい
□投稿者/ Azulean (312回)-(2014/05/25(Sun) 01:14:20)
No72200 (OROCHI さん) に返信
> char *name = "Kaname_Madoka";

> fwrite(&name, stringsize, 1, fp);

この 2 つの行をよく見直してみてください。
何のアドレスを渡しているか? C 系の言語で文字列はどういった存在か? といったところがポイントです。
引用返信 編集キー/
■72202 / inTopicNo.3)  Re[2]: 文字列をバイナリファイルに保存したい
□投稿者/ OROCHI (33回)-(2014/05/25(Sun) 11:30:28)
No72201 (Azulean さん) に返信
> ■No72200 (OROCHI さん) に返信
>> char *name = "Kaname_Madoka";
>
>> fwrite(&name, stringsize, 1, fp);
>
> この 2 つの行をよく見直してみてください。
> 何のアドレスを渡しているか? C 系の言語で文字列はどういった存在か? といったところがポイントです。

fwrite(name, sizeof(char), stringsize, fp);
で可能ですね。fwriteの特性を把握しきれていなかったのも原因のようです
解決済み
引用返信 編集キー/
■72211 / inTopicNo.4)  Re[3]: 文字列をバイナリファイルに保存したい
□投稿者/ 774RR (154回)-(2014/05/26(Mon) 09:00:57)
解決済だけど解決してないと思う

後半の読み込み部分、提示コードでは正しく動作しないはず。
C の文字列としては処理が足らないよ。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -