質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1435閲覧

C# コンソールアプリケーションでテキストファイルに書き込まれない。

gx1285

総合スコア136

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/12/25 04:01

前提・実現したいこと

C#でコンソールアプリケーションを作ってます。
言語切り替え機能を実装中に問題が発生しました。

発生している問題・エラーメッセージ

テキストファイルに書き込まれない。

該当のソースコード

C#

1 else if (prefix == "al language") 2 { 3 Console.WriteLine("JAPANかUSAを入力してください。\nPlease enter JAPAN or USA."); 4 var l = Console.ReadLine(); 5 var fileName = @"TextFile1.txt"; 6 var encoding = System.Text.Encoding.GetEncoding("UTF-8"); 7 var writer = new System.IO.StreamWriter(fileName, false, encoding); 8 writer.WriteLine(l); 9 Console.WriteLine("{0}に選択しました。\nSelected for {0}.", l); 10 }

試したこと

TextEncodingを変更した。

補足情報(FW/ツールのバージョンなど)

VS 2019
Netcore 3.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

var fileName = @"TextFile1.txt";

出力先のファイルは、パス付きで指定する必要があります。

StreamWriter コンストラクター (System.IO) | Microsoft Docs

書き込まれる完全なファイルパス。

パスを指定しない場合、ファイルは作業ディレクトリに作られます。

アプリケーションの作業ディレクトリはSystem.IO.DirectoryクラスのGetCurrentDirectoryメソッドで確認できます。

lang

1Console.WriteLine(File.Exists(Path.Combine(Directory.GetCurrentDirectory(), fileName)));

trueが出力されるはず。

補足です。

StreamWriterはIDisposableを実装しているので、インスタンスの利用が終わったらDisposeメソッドを呼び出す必要があります。usingステートメントを使用すると簡便に実装できます。

リンク先のサンプルコードを参考にしてください。

StreamWriter クラス (System.IO) | Microsoft Docs

この型は IDisposable インターフェイスを実装します。 型の使用が完了したら、直接的または間接的に型を破棄する必要があります。 直接的に型を破棄するには、try/catch ブロック内で Dispose メソッドを呼び出します。 間接的に型を破棄するには、using (C# の場合) または Using (Visual Basic 言語) などの言語構成要素を使用します。

投稿2021/12/25 04:18

編集2021/12/25 04:57
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/12/25 04:36

相対パスも「完全なファイルパス」だと思いますが。 手元で試したところ、ファイルは作成されるが内容がない状態になりました。 StreamWriterが閉じられてないので、書き込まれる前に終了してるんだと思います。 * using var writer = とする * using ステートメントを使う * CloseあるいはDisposeする --- 既定のエンコードはUTF-8なので指定する必要はありません。
jhashimoto

2021/12/25 04:57

質問を読み違えてました。ご指摘ありがとうございます。
gx1285

2021/12/25 05:21 編集

リンク先のサンプルコードを参考にしてみましたが、 上書きになってしまいます。 置き換えの方法を教えてもらえたら幸いです。
jhashimoto

2021/12/25 05:27

https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=net- 6.0#System_IO_StreamWriter__ctor_System_String_System_Boolean_System_Text_Encoding_ > public StreamWriter (string path, bool append, System.Text.Encoding encoding); > データをファイルに追加する場合は true、ファイルを上書きする場合は false。 指定されたファイルが存在しない場合、このパラメーターは無効であり、コンストラクターは新しいファイルを作成します。 StreamWriterのコンストラクタ引数appendで挙動を変更できます。リンク先のサンプルはappendを指定しないオーバーロードなので、デフォルト値のtrueが適用されています。ファイル自体を上書き(質問者さんの言う置き換え)するには、appendをfalseにします(質問者さんが提示したコードは、そのようになっています)。
guest

0

ベストアンサー

先ほどの回答は間違いです。質問を「ファイルが作成されない」と読み違えてました。

TN8001さんがコメントされているとおり、CloseかDisposeすれば書き込まれます。先に回答したとおり、usingステートメントでも実装できます。

投稿2021/12/25 04:54

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問