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 \0 = 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é :slight_smile:

  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
1 Like

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

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ế ?

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 :slight_smile: .

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ự.

2 Likes

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 ~

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.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?