こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VC++でファイルへの書き込みについて

VC++にて、ファイルへの書き込みを行っているのですが、どうもうまくいきません。


Form.h

//ファイル->開く
private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {

//開くダイアログ表示
OpenFileDialog^ dlg = gcnew OpenFileDialog();
dlg -> Filter = "CSV形式(*.csv)|*.csv|すべてのファイル(*.*)|*.*";
if (dlg -> ShowDialog() !=
System::Windows::Forms::DialogResult::OK){
return;
}

//CSV形式でファイルを読み込み
LoadCsvFile( dlg -> FileName );

}

//ファイルの読み込み
private: bool LoadCsvFile( String^ path ){

//ファイルをオープン
StreamReader^ reader = gcnew StreamReader( path,
System::Text::Encoding::GetEncoding("shift-jis"));
//ファイル読み込み
String^ data;
data = reader -> ReadLine();

st = from_cli(data); //dataをグローバル変数std::string = stに変換

reader -> Close();

return true;
}


//System::String -> std::string変換用
std::string from_cli(String^ input, Encoding^ encoding) {
array<Byte>^ result =
Encoding::Convert(Encoding::Unicode, encoding, Encoding::Unicode->GetBytes(input));
if ( result->Length != 0 ) {
pin_ptr<unsigned char> pin = &result[0];
return std::string(reinterpret_cast<char*>(pin), result->Length);
}
return std::string();
}

//ボタンクリックイベント
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

std::ofstream ofs;
ofs.open( "test.txt" );
ofs << st << std::endl; ……(1)
ofs.close();
}

csvファイルを読み込み後、ボタンクリックイベントを行ってもtext.txtの内容が書き変わりません。
(1)の部分をofs << "test" << std::endl;に変更したり、
button1_Click内で変数st2を宣言し、
ofs << st2 << std::endl;に変更すると、問題無くファイルへの書き出しが行えます。
文字コード等が関わっているのでしょうか?

御助言の程、よろしくお願いします。

投稿日時 - 2011-11-10 17:00:16

QNo.7125035

すぐに回答ほしいです

質問者が選んだベストアンサー

確認が必要な箇所が2点あります。

1つ目は、フルパスによる保存ができない件について。

> フルパスで指定するというのは、
> ofs.open("C:\Program Files\~~");
> で指定するということでしょうか?

"C:\Program Files\~~"となっていますが、パスを文字列で指定する場合、
"C:\\Program Files\\~~"と指定するのが正解ですがそうなっていますでしょうか?

もし、それでも出力できない場合、おそらく~~の中に日本語が入っていて、ロケールが日本語になっていない、というパターンだと思います。

もし知れが原因であれば、Form_Loadイベントに

setlocale(LC_ALL,"Japanese");

のようにロケール設定処理を追加するとうまくいくと思います。

それでもフルパスによる出力がうまくいかないとなると、他には原因は思い当たらないです。


もう一点は、OpenFileDialog::ShowDialog関数を使用されていますが、この関数を使用するとカレントディレクトリが移動する場合がある、ということです。

上記の例で、単に、ofs.open( "test.txt" );と指定すると、それはOpenFileDialogで指定したファイルが保存されたディレクトリ内の test.txt を指定したことになります。

それでよければ問題ないのですが、実行ファイルとの相対パス上のファイルを指定したい場合、

System::Windows::Forms::Application::StartupPath + "\\" + "test.txt"

等で自分で相対パスから絶対パスに変換すると起動時のカレントディレクトリ上のtest.txtを指定することができます。

投稿日時 - 2011-11-11 00:17:48

お礼

そうですよね。「\\」って入れないとダメですよね。
普通にコピペして貼り付けていました。お恥ずかしい。
qwertfkさんのおっしゃっている原因で間違いないです。
カレントディレクトリが移動してしまっていたようです。

ありがとうございました。
分かってみれば成程って思いますが、知識が無いとなかなか気付かないものですね。精進します。

投稿日時 - 2011-11-11 10:02:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>ofs.open( "test.txt" );
ここをフルパスで指定してみてもだめでしょうか?

投稿日時 - 2011-11-10 17:22:18

補足

フルパスで指定するというのは、
ofs.open("C:\Program Files\~~");
で指定するということでしょうか?

これだと、ファイルが開けて無いのか、
""で直接文字列を書き込んでもダメでした。
指定の仕方間違ってますでしょうか?

投稿日時 - 2011-11-10 18:03:26

お礼

おっしゃっている通りフルパス指定で解決しました。
相対パスを使ってみます。

ありがとうございました。

投稿日時 - 2011-11-11 10:07:01

あなたにオススメの質問