01/10/2018, 00:38

Hỏi 1 vài điều về tập tin nhị phân

Hi mọi người,

Mình có 1 vài điều muốn hỏi về file nhị phân như sau:

  1. Muốn ghi 1 biến double vào file nhị phân, tại sao phải để ký tự & trước biến đó ?
    VD:
double x = 1.2;
std::ofstream FileOut("SOMETHING.doc", std::ios_base::out | std::ios_base::binary);
FileOut.write((char *)&x, sizoef(double));
FileOut.close();
  1. Mình muốn ghi 1 khoảng trắng vào file nhị phân thì làm thế này có đúng không ?
FileOut.write(" ", 2 * sizeof(char)); // ký tự khoảng trắng với ký tự kết thúc chuỗi là 2
  1. Tương tự như câu 2, mình muốn ghi 1 chuỗi ký tự " - " vào file nhị phân thì làm thế này có đúng không ?
FileOut.write(" - ", 4 * sizeof(char)); // 2 ký tự khoảng trắng + 1 ký tự '-' + 1 ký tự kết thúc chuỗi  = 4
  1. Mình muốn ghi 1 line-break vào file nhị phân phải làm sao?
    VD: Nếu muốn ghi 1 line-break vào file text:
FileOut << std::endl;

Nhưng file nhị phân thì mình không biết ghi.

Cảm ơn mọi người nhé

明玉 viết 02:46 ngày 01/10/2018
  1. => Vì function prototype của ostream nó như thế nên phải làm theo như thế:
    http://www.cplusplus.com/reference/ostream/ostream/write/
    Arg1 chỉ nhận char pointer thôi, muốn làm gì cũng phải lấy vị trí trên memory (toán tử &) rồi ép kiểu về char*, nếu là pointer sẵn rồi thì chỉ ép kiểu về char* thôi.
  2. và 3) => Đúng, mà nếu bạn muốn ghi nhiều lần làm thành đoạn văn dài thì chỉ thêm null-terminated lúc cuối cùng thôi.
  3. =>
    chuẩn bị 1 biến số:
char * newLine;
newLine = "\n"; // cho Linux
newLine = "\r\n"; // cho Windows
newLine = "\r"; // cho Mac

rồi dùng như thuờng thôi:

FileOut.write(newLine, strlen(newLine)); // cộng thêm 1 vào strlen nếu bạn muốn có null-terminated
Người bí ẩn viết 02:41 ngày 01/10/2018

mà nếu bạn muốn ghi nhiều lần làm thành đoạn văn dài thì chỉ thêm null-terminated lúc cuối cùng thôi.

Mình chưa hiểu chỗ này lắm.

newLine = "\r\n"; // cho Windows

Sao phải có \r vậy bạn ? Mình tưởng newLine = "\n" là đủ ?

P/S: Cho mình hỏi null-terminated là gì thế ?

明玉 viết 02:39 ngày 01/10/2018

Mình thấy code của bạn hễ cứ ghi chuỗi là tính cả \0 , ý mình là nếu bạn muốn ghi nhiều lần thành 1 chuỗi dài trong file nhị phân thì không tính thêm \0 làm gì trừ khi là lần ghi cuối (tránh trường hợp chuỗi trong file nó như thế này: “AAA\0BBB\0”). Mà chắc tùy nhu cầu của bạn thôi .

Còn cái newLine thì làm vậy nếu bạn muốn đưa đoạn văn bản ra cho hiển thị đâu đó, dùng đúng kiểu thì hệ điều hành hiển thị đúng thôi. Còn nếu bạn chỉ xử lý, không hiển thị thì \n là đủ.

Null-terminated Character là Ký tự Ngắt Null, đánh dấu kết thúc chuỗi ký tự.

Người bí ẩn viết 02:54 ngày 01/10/2018

Mà cho mình hỏi là '\n' trong file nhị phân nó có hiểu là xuống dòng không nhỉ ?
Vì mình sợ là file nhị phân coi các ký tự khác đều là những ký tự bình thường và xử lý bình thường ~

明玉 viết 02:49 ngày 01/10/2018

Bạn làm file nhị phân rồi thì xử lý ra sao là do thuật toán của bạn cả thôi.

Bài liên quan
0