2010-06-24 25 views
7

Tôi có đoạn code sau, chạy trên Suse 10.1/G ++ 4.1.0, và nó không ghi được vào file:ofstream không tuôn

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world"; 
} 

Các tập tin được tạo ra một cách chính xác và mở ra, nhưng trống. Nếu tôi thay đổi mã để:

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world\n"; 
} 

(thêm một \n đến văn bản), nó hoạt động. Tôi cũng đã cố gắng xả bỏ dòng chảy, nhưng nó không hoạt động.

Mọi đề xuất?

+2

Làm cách nào để kiểm tra tệp kết quả? – log0

+1

Chương trình trên Debian/Sid với g ++ 4.4.4 hoạt động như mong đợi và tệp.out chứa chuỗi (không có dòng mới). Thử cập nhật trình biên dịch hoặc hệ điều hành của bạn - cả hai đều lỗi thời. – Dummy00001

+1

Bạn kiểm tra xem tệp có trống không?Làm điều này trên tập tin kết quả: wc và xem đầu ra là gì. Nó phải là 0 2 11. 0 dòng, 2 từ, 11 ký tự. Nếu không có dòng mới, đầu ra "Hello world" sẽ chạy vào dấu nhắc của bạn, vì vậy bạn có thể chỉ thiếu nó. –

Trả lời

7

Nếu bạn kiểm tra tệp của mình đang thực hiện cat, có thể vỏ của bạn đã được định cấu hình sai và không in dòng nếu không có dòng kết thúc.
std::endl thêm \n tuôn ra.

+3

Vâng, hãy thử thực hiện tệp 'cat; echo'. Đừng cố ý sử dụng 'endl'. Tôi ghét mã sử dụng cấu trúc ngu ngốc đó và tôi ước các tiêu chuẩn mà mọi người sẽ loại bỏ nó khỏi tiêu chuẩn. Đỏ mặt là tốn kém, và nên luôn luôn được thực hiện có ý thức và với sự suy nghĩ trước. – Omnifarious

+0

Vấn đề là trình soạn thảo lỗi được sử dụng trong tác phẩm của tôi không hiển thị dòng nếu không có '\ n' ở cuối. Rõ ràng, vi cho thấy nó đúng. Cảm ơn. –

0

Liệu

file << "Hello world" << std::endl; 

làm việc?

endl chèn một dòng mới và xóa bộ đệm. Đó là những gì bạn đang đề cập đến khi bạn nói rằng bạn đã cố gắng xả nó?

4

Không biết nếu điều này là những gì bạn đã cố gắng nhưng bạn nên làm:

file << "Hello World" << std::flush; 

Cập nhật; Tôi đi đây câu trả lời này ở đây vì những ý kiến ​​hữu ích

Dựa trên phản hồi, tôi sẽ sửa đổi lời khuyên của tôi: bạn nên không cần phải gọi một cách rõ ràng std::flush (hoặc file.close() cho rằng vấn đề), bởi vì destructor làm nó cho bạn.

Ngoài ra, kêu gọi tuôn ra một cách rõ ràng buộc một hoạt động I/O có thể không phải là cách tối ưu nhất. Trì hoãn các iostream và hệ điều hành cơ bản sẽ tốt hơn.

Rõ ràng vấn đề của OP không liên quan đến việc gọi điện thoại hoặc không gọi std::flush và có thể là do cố gắng đọc tệp trước khi trình phá hủy luồng tệp được gọi.

+2

Các destructor 'ofstream' sẽ tự động tuôn ra. – Omnifarious

+0

@Omnifarious: Điều đó xứng đáng là một downvote? Câu trả lời của tôi là * sai *? –

+1

@ John Weldon - Điều này sai vì nó không thực sự giải quyết vấn đề thực tế của OP. Nó có thể hữu ích trong việc gỡ lỗi và tìm ra vấn đề thực sự là gì (và nên có một nhận xét), nhưng không phải là một giải pháp. Nếu nó có nghĩa là một giải pháp nó cho thấy một giải pháp phong cách hàng hóa-cult, trong đó một chèn mã mà không hiểu tại sao nó cần phải có. – Omnifarious

4

Trình phá hủy phải tuôn ra và đóng tệp.

Tôi khá chắc chắn, lỗi này là một nơi khác, một trong hai

1) Bạn không kiểm tra tại các điểm ngay trong thời gian. Tại thời điểm nào bạn so sánh nội dung của tệp, "sau" các lần thoát, hoặc bạn có đặt điểm ngắt trước khi thoát khỏi chương trình không và sau đó bạn kiểm tra nội dung tệp?

2) Bằng cách nào đó chương trình gặp sự cố trước khi thoát khỏi chương trình?

+0

Vâng, nếu chương trình như được cho chạy và sau khi nó hoàn thành xong và bạn nhận được nhắc nhở của bạn trở lại nó không chứa dữ liệu, có một lỗi ở đâu đó. – Omnifarious

Các vấn đề liên quan