2012-03-14 29 views
6

Đây là mã của tôi:C++ dòng ofstream nghỉ

#include <iostream> 
#include <fstream> 
using namespace std; 
int main() 
{ 
    ifstream ifile ("input.dat", ios::in); 
    ofstream ofile ("output.dat",ios::out); 

    int num; 
    ifile >> num; 
    ofile << num; 
    ofile << endl; 
    ofile << "Did we go to new line?"; 
    ofile << endl; 

    return 0; 
} 

Vấn đề là, tất cả mọi thứ trong output.dat là trên cùng một dòng. Làm cách nào tôi có thể giải quyết vấn đề này?

Cảm ơn!

EDIT: Tôi đã sử dụng Windows để xem các tệp và Linux cần biên dịch. Đây là lý do tại sao tôi đã gặp phải vấn đề này. Sử dụng cat output.dat ở phía Linux để xem nội dung tệp sẽ tiết lộ rằng các ngắt dòng Windows so với Linux khác nhau vào thời điểm đó.

+2

bản sao có thể có của [C++ Ofstream a new line] (http://stackoverflow.com/questions/6352283/c-ofstream-a-new-line) – karlphillip

+2

[Inconceivable] (http://www.youtube.com/watch? v = 1-b7RmmMJeo). Bạn * chắc chắn * output.dat chỉ có một dòng? Bạn kiểm tra như thế nào? Ngoài ra, bạn đang sử dụng hệ điều hành và trình biên dịch nào? –

+0

Tôi đang sử dụng cửa sổ và notepad để kiểm tra tệp đầu ra. –

Trả lời

2

std :: endl đã chèn dấu ngắt dòng, vì vậy bạn có dấu ngắt dòng trong tệp của mình. Tôi cho rằng bạn đang tạo tập tin của bạn trên một hệ thống LF (Linux hoặc UNIX khác) và xem nó trên một hệ thống CRLF. Trong trường hợp này, linebreak của bạn sẽ không hiển thị trong trình soạn thảo văn bản dưới dạng dấu ngắt dòng. unix2dos là bạn của bạn.

+0

Tôi đang sử dụng cửa sổ và notepad để kiểm tra tệp đầu ra. –

+3

Thậm chí nếu anh ta tạo ra dưới Unix và đọc theo Windows, hầu hết các biên tập viên sẽ hiển thị nó một cách chính xác. Nếu đó là vấn đề của mình, giải pháp đúng là sử dụng một trình soạn thảo khác; một chương trình Windows thực sự sẽ xuất ra CRLF, nhưng bất khả tri đối với đầu vào (giống như một chương trình Windows thực sự sẽ xuất ra '\' làm dấu tách đường, nhưng chấp nhận cả '\' và '/'). –

+2

@ Pirate43 Notepad là vô ích. Hãy thử bất cứ điều gì khác (thậm chí 'gõ tên tập tin' từ một cửa sổ giao diện điều khiển). –

5

Thay thế std::endl bằng "\r\n" để lấy CRLF thay vì chỉ LF.

+5

Tôi khuyên bạn nên chống lại điều này. Ngoại trừ rằng nếu bạn đang viết các tập tin dưới Unix, và bạn muốn kết thúc dòng Windows, không có nhiều thay thế. (Tôi tự hỏi nếu có ai đã thực hiện một 'filebuf' mà có một tùy chọn định dạng bổ sung, để xác định quy ước kết thúc dòng mà nên được sử dụng cho đầu ra.) –

+0

@ JamesKanze: thực sự, tôi không thể đồng ý nhiều hơn, nhưng có vẻ như rằng là những gì xảy ra ở đây. Làm việc với 'filebuf' là tốt hơn, và tôi rất thích nhìn thấy nó ở đây. –

+0

@ JamesKanze bằng cách tôi nghi ngờ nếu bạn của chúng tôi ở đây, có thể đi đến mức độ đó, và rằng ông đang có một loạt các ứng dụng để có mã của mình làm việc trên rằng ông nên thử 'filebuf'. –