2010-10-05 40 views
9

Làm thế nào để đọc và ghi vào các tập tin nhị phân trong ngôn ngữ D? Trong C sẽ là:File nhị phân I/O


    FILE *fp = fopen("/home/peu/Desktop/bla.bin", "wb"); 
    char x[4] = "RIFF"; 

    fwrite(x, sizeof(char), 4, fp); 

Tôi tìm thấy rawWrite tại D docs, nhưng tôi không biết cách sử dụng, cũng như không làm những gì tôi nghĩ. fread là từ C:

T [] rawRead (T) (T [] buffer);

Nếu tệp không được mở, hãy ném ngoại lệ. Nếu không, hãy gọi số fread để xử lý tệp và phát sinh lỗi.

rawĐọc luôn đọc ở chế độ nhị phân trên Windows.

Trả lời

7

rawRead và rawWrite nên cư xử hệt như fread, fwrite, chỉ có họ là các mẫu để chăm sóc các kích cỡ đối số và độ dài.

ví dụ:

auto stream = File("filename","r+"); 
auto outstring = "abcd"; 
stream.rawWrite(outstring); 
stream.rewind(); 
auto inbytes = new char[4]; 
stream.rawRead(inbytes); 
assert(inbytes[3] == outstring[3]); 

rawRead được thực hiện trong điều kiện của fread như

T[] rawRead(T)(T[] buffer) 
    { 
     enforce(buffer.length, "rawRead must take a non-empty buffer"); 
     immutable result = 
      .fread(buffer.ptr, T.sizeof, buffer.length, p.handle); 
     errnoEnforce(!error); 
     return result ? buffer[0 .. result] : null; 
    } 
+0

Cảm ơn câu trả lời tuyệt vời. –

+0

Điều gì sẽ xảy ra nếu dữ liệu của bạn đã có trong bộ nhớ (nhận được từ cuộc gọi api) thay vì trên đĩa? Stream api không hỗ trợ rawRead, và không có tập tin xử lý nào để chuyển tới .fread ... –

2

Nếu bạn chỉ muốn đọc trong một bộ đệm lớn các giá trị (nói, ints), bạn chỉ có thể làm:

int[] ints = cast(int[]) std.file.read("ints.bin", numInts * int.sizeof); 

std.file.write("ints.bin", ints); 

Tất nhiên, nếu yo u có dữ liệu có cấu trúc hơn thì câu trả lời của Scott Wales phù hợp hơn.