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

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

新規登録して質問してみよう
ただいま回答率
85.50%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

2回答

1293閲覧

C# バイナリファイルの書き込みができない。

onGu

総合スコア21

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2018/11/08 05:25

こんにちは
ネットにあったコードを利用してバイナリファイルの任意の場所を書き替えるコードを考えています。
FileStreamで読んで配列に入れて任意の場所を変更後書き換えるようにしたいのですが、
最後のfs.writeまで進んでも書き換わっていません。
binary.readerで読んでBinary.writeでないと書き換わらないのでしょうか?
512バイトをよんでbuf[0]を変更。
下記コード試行錯誤でぐちゃぐちゃになってます。Visualstudio2017 C#コンソールアプリで開発しています。
よろしくお願いします。。

static void Main(string[] args)
{
FileStream fs = new FileStream(@"d:\028mn2.dat", FileMode.Open, FileAccess.ReadWrite);
// BinaryReader fb = new BinaryReader(fs);

int fileSize = (int)fs.Length; // ファイルのサイズ //byte[] buf = new byte[fileSize]; // データ格納用配列 byte[] bufb = new byte[512]; byte[] buf = new byte[512]; // データ格納用配列 int readSize; // Readメソッドで読み込んだバイト数 int remain = fileSize; // 読み込むべき残りのバイト数 int bufPos = 0; // データ格納用配列内の追加位置 while (remain > 0) { // 1024Bytesずつ読み込む //readSize = fs.Read(buf, bufPos, Math.Min(1024, remain)); readSize = fs.Read(buf, 0, Math.Min(512, remain)); //fb.Read(buf, 0, Math.Min(512, remain)); Console.WriteLine(readSize); Console.WriteLine(bufPos); //Array.Clear(buf, 0, 512); Console.WriteLine(buf[0]); Console.WriteLine(buf[1]); Console.WriteLine(buf[2]); Console.WriteLine(buf[3]); Console.WriteLine(buf[4]); Console.WriteLine(buf[5]); Console.WriteLine(buf[6]); Console.WriteLine(buf[7]); Console.WriteLine(buf[8]); bufPos += readSize; remain -= readSize; buf[0] = 0x5b; bufb[0] = 0x5b; //Console.WriteLine(buf[1]); fs.Write(buf, 0, 512); //readSize = fs.Read(buf, 0, Math.Min(512, remain)); fs.Dispose(); Console.ReadKey();

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/08 05:40

コードは ``` と ``` で囲ってください。インデントされて見やすくなります。あと、「下記コード試行錯誤でぐちゃぐちゃ」だと思うならきちんと整理して書き直してください。質問は読んでもらわないと意味がないわけで、読みやすくする努力をするのは質問者さんにも益があるはず。
guest

回答2

0

FileStreamのPositionが戻ってないから、思っている場所と異なる場所に書いているだけではないでしょうか。
だから、512Byte読み込んで、書き込みが513Byte目からとなっている形だと思います。

FileStream.Writeのoffsetはファイルの書き込み位置ではなくて、第1引数のバイト配列のどこから書き込むかの指定です。
書き込む前にPositionを戻すなりしてやればよろしいかと

投稿2018/11/08 06:20

YAmaGNZ

総合スコア10222

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

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

onGu

2018/11/09 00:07

FileStreamのPosition 理解し正常動作につながりました。ありがとうございました。
guest

0

ベストアンサー

ファイル操作はバッファリングされてますので、Writeだけでは書き換わりません。
flushあるいはCloseしましょう

投稿2018/11/08 06:18

y_waiwai

総合スコア87719

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

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

onGu

2018/11/09 00:07

そもそもCloseを記述してなかったので、ファイルは更新されていませんでした。 ベストアンサーにさせて頂きます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問