30/09/2018, 16:57

Dùng hàm read() và write() trong copy nội dung file

Em có làm 1 chương trình copy file như sau:

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

//! ham copy noi dung tu file nay sang file khac
void copyStreamContent(ifstream& src, ofstream& des){
    int length = 100;
    char* buffer = new char[length];

    while (!src.eof()){
        src.read(buffer, length);
        cout << "Read " << src.gcount() << " byte(s)!
";
        des.write(buffer, length);
    }
}

int main(){

    ifstream fIn("copy_file_binary.cpp", ios::in);
    if (!fIn.is_open()){
        cout << "Error: Not Found!
";
        exit(EXIT_FAILURE);
    }
    ofstream fOut("destination", ios::out);

    copyStreamContent(fIn, fOut);
    return 0;
}

Tên tệp này là: copy_file_binary.cpp
Trong đó em có sử dụng 2 hàm read() và write() của thư viện fstream để đọc các block của file. Chương trình này sẽ hoàn thành đúng nhiệm vụ nếu file source là 1 file BINARY đúng nghĩa! Nhưng nếu thay file source bằng 1 file TEXT, kết quả là: file destination có thêm 1 số kí tự bị thừa ở phía sau. Ai giải thích giùm em vấn đề này với ạ? Có phải 2 hàm read(), write() của fstream chỉ dùng được đối với file binary hay là do cái gì gây ra như thế?
Em xin cảm ơn trước

Nguyễn Minh Dũng viết 19:03 ngày 30/09/2018

Chắc chỗ này đọc sai rồi

//! ham copy noi dung tu file nay sang file khac
void copyStreamContent(ifstream& src, ofstream& des){
    int length = 100;
    char* buffer = new char[length];

    while (!src.eof()){
        src.read(buffer, length);
        cout << "Read " << src.gcount() << " byte(s)!\n";
        des.write(buffer, length);
    }
}

Số lượng ký tự của file source có phải là bội số của 100 không? Vì nếu source không phải là bội số của 100 thì nó sẽ đọc thêm các ký tự không thuộc về file, dẫn đến lưu vào giá trị rác.

BQC viết 19:04 ngày 30/09/2018

A! Đúng rồi, em cảm ơn anh!

... viết 19:13 ngày 30/09/2018
void copyStreamContent(ifstream& src, ofstream& des){
    int length = 100;
    char* buffer = new char[length]; //không thấy delete buffer ở chổ nào cả
NG viết 19:00 ngày 30/09/2018

biến length là độ dài bạn muốn đọc ghi phải không?vậy thì sao trong hàm read,write lại khai báo length. chỗ đó là kích thước dữ liệu cần đọc, ở đây là kiểu char nên phải là sizeof(char)*100

Tuấn Trần viết 19:11 ngày 30/09/2018

phải sửa lại như thế nào vậy ạ

Bài liên quan
0