30/09/2018, 23:16

Ghi file binary trong C++, file kết quả lại thành file text?

mình ghi file với chế độ bin
không hiểu thế nào mà nó lại thành file text nhỉ, có thể mở bằng notepad và đọc được các kí tự ascii

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void ghi(string,  char );

int main(){
	int songuyen = 1;
	float sothuc = 2.2;
	char kitu = 'q';
	ghi("output.dat",  kitu);
	system("pause");
	return 0;
}

void ghi(string name, char kitu){
	ofstream ghi(name, ios::binary);
	ghi.write(&kitu, sizeof(kitu));
	cout << "Write data finished" << endl;
	ghi.close();
} 

file output.dat có thể mở để đọc như file text

Khánh Nguyễn viết 01:20 ngày 01/10/2018

File text bạn nói nó cũng là một file binary thôi, vì bất kì file nào cũng ở dưới dạng binary cả. Khi viết như bạn, thì giá trị của 1 byte đầu, tính từ địa chỉ của kí tự sẽ được ghi vào file. Cụ thể ở đây là 01110001 (mã nhị phân cho kí tự ‘q’). Khi notepad mở file này lên, thì nó cũng thấy 01110001, thế là nó tra trong bảng mã ascii xem dãy này kí hiệu cho kí tự gì. Cụ thể ở đâu là ‘q’, nên nó sẽ in ra ‘q’. Không có gì kì lạ ở đây cả.

abcxyz viết 01:31 ngày 01/10/2018

sao lại thế ta?
file text, dữ liệu được ghi vào file sẽ được chuyển từ mã máy về ascii, rồi mới ghi vào, => trình soạn thảo đọc được
còn file nhị phân, dữ liệu ghi vào k được mã hóa, nó ghi dữ liệu ở dạng thô, mã máy, thì khi trình soạn thảo như notepad , k thể đọc được, => k thể nhìn thấy kí tự ascii mà thấy toàn kí tự lạ
trương hợp này notepad đã đọc được có nghĩa là dữ liệu ghi vào file đã được mã hóa
giờ mình lấy 1 file được ghi ở nhị phân, nhưng là dùng c để ghi, bạn mở lên sẽ k đọc được kí tự,mà nó sẽ ra 1 mớ kí tự lạ
file nhị phân được ghi bằng c, cũng là file nhị phân, tại sao notepad lại k tự chuyển từ mã máy về ascii??
còn ghi file nhị phân bằng c++ như trên , thì kết quả như ở câu hỏi của mình

abcxyz viết 01:31 ngày 01/10/2018
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

main()
{
    FILE *fp;
    if( ! (fp = fopen("binary.dat", "wb+")))
    {
        printf("Khong the mo file!\n");
        exit(0);
        getch();
    }
    int a[] = {1,2};
    fwrite(a, sizeof(a), 1, fp);   
    fclose(fp);
    getch();
    return 0;
}

ghi file nhị phân bằng c, mở file nhị phân lên bằng notepad hoặc notepad ++ thì không thể nhìn thấy dữ liệu ở dạng ascii

Khánh Nguyễn viết 01:20 ngày 01/10/2018

Lúc này bạn đang ghi biến kiểu int vào, nên notepad không đọc được là đúng. Còn lúc nãy bạn ghi vào kiểu char, nên nó vẫn đọc bình thường.

abcxyz viết 01:28 ngày 01/10/2018

kì vậy ta?

abcxyz viết 01:31 ngày 01/10/2018

nhưng số nguyên thì cũng được biểu diễn trong máy là mã nhị phân
kí tự cũng thế
tại sao nó chỉ hiển thị mỗi kí tự mà lại k hiển thị số?

abcxyz viết 01:17 ngày 01/10/2018

mình thử lại, đúng là trong c, ghi số thì k thể mở bằng notepad xem được
còn ghi chữ thì có thể đọc được, nhưng nó còn có thêm 1 mớ kí tự ở sau

Khánh Nguyễn viết 01:27 ngày 01/10/2018

Bạn đang bị một chút nhầm lẫn trong vấn đề binary và text. Bạn thử tham khảo trang này xem: http://stackoverflow.com/questions/29200427/writing-text-to-binary-file-whats-the-difference
Nếu còn chưa hiểu thì bạn cứ google về vấn đề này, có rất nhiều câu hỏi và câu trả lời chắc chắn là dễ hiểu hơn so với cách diễn đạt của mình.

abcxyz viết 01:28 ngày 01/10/2018

nghĩ là mình có 1 biến int x = 1297;
nếu ghi bằng chế độ văn bản thì nó sẽ lưu số 1297 thành ‘1’, ‘2’, ‘9’, ‘7’ trong đó các số này là kí tự và sẽ có mã ascii
kí tự 1 có mã : 000 0001
kí tự 2 có mã : 000 0010
kí tự 9 có mã : 000 1001
kí tự 7 có mã : 000 0111
nên khi mở băng notepad thì nó load mã máy, trùng với mã ascii nên nó hiển thị được

còn ghi bằng chế độ nhị phần thì số 1297 sẽ được đưa về hệ 2 = 10100010001

kí tự khi chuyển sang hệ 2 thì có mã giống trong bảng mã ascii , nên mở notepad lên thì nhìn được, còn số chuyển về hệ 2 thì k có trong mã ascii nên mở lên ra kí tự lạ ? đúng k bạn?

Quân viết 01:17 ngày 01/10/2018

Yes, đúng rồi đó bạn, ghi chế độ văn bản thì sẽ phải encode và mapping kí tự nữa, chứ thực tế cũng đều ghi vào file chỉ có toàn 0 với 1

abcxyz viết 01:27 ngày 01/10/2018

thế khi đọc file, nó đọc mã assii, rồi đổi về thập phân, rồi lại phải liên kết các số 1 2 9 7 lại thành 1297 à bạn :d tks

Quân viết 01:27 ngày 01/10/2018

Không, mã ở hệ thập phân là dành cho người đọc thôi, chứ máy tính chỉ làm việc ở hệ binary, cần gì phải chuyển lại cho tốn cpu bạn, mapping trực tiếp sang kí tự luôn

abcxyz viết 01:29 ngày 01/10/2018

mapping là quá trình gắn kết các kí tự
kí tự 1 có mã : 000 0001
kí tự 2 có mã : 000 0010
kí tự 9 có mã : 000 1001
kí tự 7 có mã : 000 0111
lại thành số 1297 hả bạn?

Bài liên quan
0