1

C#でファイルに2次元配列を書き込む最も簡単な方法は何ですか?

これまで読んだ質問はすべて文字列配列に関するものですが、データを書き込む必要があります。私は古いCプロジェクトを変換していますが、Cでは簡単でした。

FILE *file;
unsigned char site[32][10];

配列を初期化し、読み取り/書き込み用にファイルを開きます(ファイルはプロジェクトで常に開いています)。

データを書き込むには:

if (fseek (file, offset, SEEK_SET))
  return (0);
return (fwrite (&site, sizeof (site), 1, file));

データを読み取るには:

if (fseek (file, offset, SEEK_SET))
  return (0);
return (fread (&site, sizeof (site), 1, fsite));

ファイルを常に開いている必要はないので、次のことを試しました。

byte [,] = new byte[32,10] = { some data here };
File.WriteAllBytes(fileDescr, site);

ただし、2次元配列では機能しません。

4

4 に答える 4

5

参考文献:

using System.Runtime.Serialization.Formatters.Binary;

方法:

public static void Serialize(object t, string path)
{
    using(Stream stream = File.Open(path, FileMode.Create))
    {
        BinaryFormatter bformatter = new BinaryFormatter();
        bformatter.Serialize(stream, t);
    }
}
//Could explicitly return 2d array, 
//or be casted from an object to be more dynamic
public static object Deserialize(string path) 
{
    using(Stream stream = File.Open(path, FileMode.Open))
    {
        BinaryFormatter bformatter = new BinaryFormatter();
        return bformatter.Deserialize(stream);
    }
}

使用中で

//Saving
byte[,] TestArray = new int[1000,1000];
//...Fill array
Serialize(TestArray, "Test.osl");

//Loading
byte[,] TestArray = (byte[,])Deserialize("Test.osl");
于 2013-03-19T23:21:41.207 に答える
1

古い 'C' プログラムのファイル形式との下位互換性を維持する必要がある場合は、Windows API を使用してデータを書き込むのが最も簡単な場合があります。(そうでない場合は、BinaryFormatter前の回答で述べたように a を使用する必要があります)。

ただし、Windows API を使用たい場合は、次の例をご覧ください。

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;

namespace Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var site = new byte[32,10];

            using (var fs = new FileStream("C:\\TEST\\TEST.BIN", FileMode.Create))
            {
                FastWrite(fs, site, 0, 32*10);
            }
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]

        private static extern bool WriteFile
        (
            IntPtr hFile,
            IntPtr lpBuffer,
            uint nNumberOfBytesToWrite,
            out uint lpNumberOfBytesWritten,
            IntPtr lpOverlapped
        );

        public static void FastWrite<T>(FileStream fs, T[,] array, int offset, int count) where T : struct
        {
            int sizeOfT = Marshal.SizeOf(typeof (T));
            GCHandle gcHandle = GCHandle.Alloc(array, GCHandleType.Pinned);

            try
            {
                uint bytesWritten;
                uint bytesToWrite = (uint) (count*sizeOfT);

                if (!WriteFile(
                    fs.SafeFileHandle.DangerousGetHandle(),
                    new IntPtr(gcHandle.AddrOfPinnedObject().ToInt64() + (offset*sizeOfT)),
                    bytesToWrite,
                    out bytesWritten,
                    IntPtr.Zero
                )){
                    throw new IOException("Unable to write file.", new Win32Exception(Marshal.GetLastWin32Error()));
                }

                Debug.Assert(bytesWritten == bytesToWrite);
            }

            finally
            {
                gcHandle.Free();
            }
        }
    }
}
于 2013-03-19T23:50:38.683 に答える
0

を使用しSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatterます。

public void Serialize(String path, byte[,] myArray)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        formatter.Serialize(stream, myArray);
    }
}

ファイルを読み取るには、BinaryFormatter のDeserializeメソッドを使用します。

public byte[,] Deserialize(String path)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        byte[,] myArray = (byte[,])formatter.Deserialize(stream);
    }
}
于 2013-03-19T23:34:59.027 に答える
0
    // For I/O
    using System.IO;  

    // Output Stream Writer variable
    StreamWriter yourOSW;  

    // Open the file
    yourOSW = new StreamWriter(fileName); 

    // To declare array
    byte[,] yourArray = new byte[numRows, numColumns];  

    // Data value
    byte num = 0;  

    // To fill array (example)
    for(byte i = 0; i < numRows; i++)
    {
        for(byte j = 0; j < numColumns; j++)
        {
            yourArray[i,j] = num;
            num++;
        }
    }

    // To write array to file
    for(byte i = 0; i < numRows; i++)
    {
        for(byte j = 0; j < numColumns; j++)
        {
            yourOSW.WriteLine(yourArray[i,j]);
        }
    }
于 2013-03-19T23:43:46.107 に答える