Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: [C++]Hỏi về sao chép tệp ?

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định [C++]Hỏi về sao chép tệp ?

    Em có hai đoạn code sau , em làm với mục đích sao chép tệp . Đoạn code 1 chạy ngon lành , sao y chang . Đoạn code 2 bị thiếu mất mấy chữ . Xin giải thích giùm em . Cảm ơn a .
    Code 1:
    Code:
    void main() //sao tep vanban.txt qua tep vanban2.txt
    {
     clrscr();
     char c[50];
     int n;
     fstream f("C:\\vanban.txt",ios::in|ios::binary);
     fstream g("C:\\vanban2.txt",ios::out|ios::binary);
     while(f.read(c,50),(n=f.gcount()))
     g.write(c,n);
    
     f.close();
     g.close();
     getch();
    
    }
    Code 2:
    Code:
    void main() //sao tep vanban.txt qua tep vanban2.txt
    {
     clrscr();
     char c[50];
     int n;
     fstream f("C:\\vanban.txt",ios::in|ios::binary);
     fstream g("C:\\vanban2.txt",ios::out|ios::binary);
     while(f.read(c,50))
     {
      n=f.gcount();
      g.write(c,n);
     }
     f.close();
     g.close();
     getch();
    
    }

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Code thứ nhất cái n=f.gcount(); // Ngoài việc thực thi nó còn là điều kiện của while.
    while(f.read(c,50),(n=f.gcount())// Trong khi cả 2 điều kiện trong ngoặc thỏa mãn. Tức là n=f.gcount() đã được thực thi trước khi xét điều kiện.

    Còn đoạn code thứ 2: chỉ cần f.read(c,50) thỏa mãn thôi.
    Lúc này n=f.gcount(); chỉ thực thi khi mà điều kiện f.read(c,50) thỏa mãn.
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Code:
    while(f.read(c,50),(n=f.gcount()))
    Theo em nghĩ cái dấu , trong thân while ấy tương đương dấu || chứ ko phải dấu && đâu . Vì giả sử như hàm f.read ko đọc đủ 50 ký tự ( do số ký tự trong file chưa đến mức đó ) thì nó sẽ trả về 0 . Nhưng ta vẫn có n khác 0 vì vậy câu lệnh g.write(c,n); vẫn được thực hiện . Ai có ý kiến góp cho em với .

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Dấu , trong vòng while không tương được & hay | gì cả, nguyên cả đk trong vòng while trên sẽ chỉ dựa vào giá trị của n, = 0 hay #0 mà thôi. Bug ở đây, 1 bug của suy nghỉ tai hại là viết code sao cho ngắn, ít dòng.

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Ah, Dr nhầm rồi. Vừa thử lại xong.

    Bạn có thể cho Dr biết nó thiếu chữ gì hay thiếu mấy chữ như thế nào không? Có phải mấy chữ ở cuối file hay không?
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định [C++]Hỏi về sao chép tệp ?

    À , em nhớ ra rồi , đúng rồi . Có 1 ví dụ như thế này

    Code:
    for(i=0;i<5,i<7;i++)
    cout<<"hehehe";
    Ta được in ra 7 câu hehehe . Đây là do khi có nhiều biểu thức cách nhau bởi dấu , thì trình biên dịch sẽ chọn biểu thức phải nhất làm điều kiện . Cám ơn mọi người nhé .

    Vâng nó thiếu mấy chữ ở cuối file . Em làm thế này , đầu tiên em tạo 1 file vanban.txt trong ổ C với nội dung là 1 bài thơ . Từng câu thơ em cho xuống hàng . Rồi em chạy chương trình nhập tên tệp ấy để sao nó cho tệp khác . Em dùng code 1 thì ngon lắm . Code 2 thì ko được .
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 17-01-2008 lúc 10:44 PM. Lý do: làm liền

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Thì đúng rồi, bạn thay số 50 trong code của bạn thành 1000 chẳng hạn sẽ hết lỗi hiện tại của bạn. Hiểu chứ

    sieuphuong lưu ý: Không gửi liên tục liền nhau nhiều bài viết trong cùng một đề tài. Nếu tái phạm sẽ bị xóa bỏ đó nhé. Lúc đó lại kêu tại sao bài viết bị xóa bỏ.
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Code 2 của cậu chạy sai là do khi read gặp EOF, nó sẽ không đọc hết số ký tự còn lại vào buffer c, thay vào đó nó sẽ setstate(failbit) và while sẽ thoát vì f.read sẽ return operator void*, *this, và trả về trị của !f.fail(), f.fail() tới đây = true, nên !f.fail() = false.
    Fix như Dreamness từ 50 tới 1000 cũng sẽ sai vì chắc chắn số char còn lại sẽ < 1000. Sữa lại thành char c thì hết, dùng sizeof, hoặc check eof().
    Cậu sữa code lại như sau:
    Code:
        char c[50] = { 0 };
        ...........
        while (false == f.eof())
        {
            f.read(c, sizeof(c));
            g.write(c, f.gcount());
        }
         .....
    Đã được chỉnh sửa lần cuối bởi TQN : 17-01-2008 lúc 11:30 PM.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn