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;に変更すると、問題無くファイルへの書き出しが行えます。
文字コード等が関わっているのでしょうか?
御助言の程、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
確認が必要な箇所が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を指定することができます。
そうですよね。「\\」って入れないとダメですよね。
普通にコピペして貼り付けていました。お恥ずかしい。
qwertfkさんのおっしゃっている原因で間違いないです。
カレントディレクトリが移動してしまっていたようです。
ありがとうございました。
分かってみれば成程って思いますが、知識が無いとなかなか気付かないものですね。精進します。
No.1
- 回答日時:
>ofs.open( "test.txt" );
ここをフルパスで指定してみてもだめでしょうか?
この回答への補足
フルパスで指定するというのは、
ofs.open("C:\Program Files\~~");
で指定するということでしょうか?
これだと、ファイルが開けて無いのか、
""で直接文字列を書き込んでもダメでした。
指定の仕方間違ってますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 二つ上のディ...
-
エクセルvbaでdocuworksprinter...
-
xcopyコマンドの進行状況を表示...
-
エクセルVBAで一つ上の階層...
-
Excel 相対パス
-
コマンドプロンプトのコピー関...
-
EXCEL(VBA)で指定フォルダ内の...
-
【Excel VBA】Power Qurry のソ...
-
AccessからExcel最小化
-
ファイル名の半角スペースについて
-
指定したフォルダ内の最新ファ...
-
fopenでのパス指定
-
ExcelVBAの使い方 ¥の使い方...
-
パスワード保護されたExcelファ...
-
ExcelのVBAで上書き保存を確...
-
【VB.NET】App.configにファイ...
-
Cの関数で自分自身のパス取得
-
outlook開けない
-
SaveAsの保存先について
-
【VBA】ExcelマクロでCSVファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 二つ上のディ...
-
エクセルvbaでdocuworksprinter...
-
Excel 相対パス
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
初心者powershellのPS1ファイル...
-
【VB.NET】App.configにファイ...
-
【VBA】ExcelマクロでCSVファイ...
-
エクセルのマクロで特定フォル...
-
VBA★PDFをPDFアプリで印刷し...
-
パスワード保護されたExcelファ...
-
SaveAsの保存先について
-
ExcelVBAの使い方 ¥の使い方...
-
Windows PowerShellでscoopコマ...
-
開いているファイルを削除し、...
-
VBS パスに変数を入れたい
-
C#でのProcess.Startと変数path
-
コマンドプロンプトのコピー関...
-
EXCEL(VBA)で指定フォルダ内の...
-
実行ファイルのパスを取得したい
おすすめ情報