Làm cách nào để nối văn bản vào tệp văn bản trong C ++?


Câu trả lời:


283

Bạn cần chỉ định chế độ mở thêm như

#include <fstream>

int main() {  
  std::ofstream outfile;

  outfile.open("test.txt", std::ios_base::app); // append instead of overwrite
  outfile << "Data"; 
  return 0;
}

12
Không cần phải đóng tệp bằng tay, vì nó làm như vậy khi hủy. Xem stackoverflow.com/questions/748014 . Ngoài ra, <iostream> không được sử dụng trong ví dụ.
swalog

6
Bạn có thể sử dụng ios :: app thay cho ios_base :: app
Trevor Hickey

4
Có thể sử dụng std::ofstream::out | std::ofstream::appthay thế std::ios_base::app? cplusplus.com/reference/fstream/ofstream/open
Volomike

6
Bạn cũng có thể làm nhiều hơn trong hàm tạo nếu bạn muốn cắt giảm mã: std :: ofstream outfile ("test.txt", std :: ios_base :: app);
đầm lầy

Bạn không cần chỉ định outrõ ràng cờ khi sử dụng std::ofstream, nó luôn sử dụng outcờ ngầm cho bạn. Tương tự với incờ cho std::ifstream. Bạn sẽ phải xác định rõ ràng inoutcờ nếu bạn đang sử dụng std::fstreamthay thế.
Rémy Lebeau

12

Tôi sử dụng mã này. Nó đảm bảo rằng tệp được tạo nếu nó không tồn tại và cũng thêm một chút kiểm tra lỗi.

static void appendLineToFile(string filepath, string line)
{
    std::ofstream file;
    //can't enable exception now because of gcc bug that raises ios_base::failure with useless message
    //file.exceptions(file.exceptions() | std::ios::failbit);
    file.open(filepath, std::ios::out | std::ios::app);
    if (file.fail())
        throw std::ios_base::failure(std::strerror(errno));

    //make sure write fails with exception if something is wrong
    file.exceptions(file.exceptions() | std::ios::failbit | std::ifstream::badbit);

    file << line << std::endl;
}

11
 #include <fstream>
 #include <iostream>

 FILE * pFileTXT;
 int counter

int main()
{
 pFileTXT = fopen ("aTextFile.txt","a");// use "a" for append, "w" to overwrite, previous content will be deleted

 for(counter=0;counter<9;counter++)
 fprintf (pFileTXT, "%c", characterarray[counter] );// character array to file

 fprintf(pFileTXT,"\n");// newline

 for(counter=0;counter<9;counter++)
 fprintf (pFileTXT, "%d", digitarray[counter] );    // numerical to file

 fprintf(pFileTXT,"A Sentence");                   // String to file

 fprintf (pFileXML,"%.2x",character);              // Printing hex value, 0x31 if character= 1

 fclose (pFileTXT); // must close after opening

 return 0;

}

28
Đây là cách C, không phải C ++.
Dženan

3
@ Dženan. C là tập con của C ++ không làm mất hiệu lực phương pháp này.
Trả lời

6
@Osaid C không phải là tập con của C ++. Trình biên dịch biên dịch mã của nó để tương thích ngược. Nhiều thứ hợp lệ C không phải là C ++ - những thứ hợp lệ, ví dụ như VLA.
stryku

Nhưng nếu chúng ta muốn nối văn bản ở giữa tập tin? với phong cách C? sử dụng TẬP TIN * ?? "A +" hoặc "a" với fseek () và ftell () không hoạt động với tôi
vincent thorpe 25/03/19

2

Bạn cũng có thể làm như thế này

#include <fstream>

int main(){   
std::ofstream ost {outputfile, std::ios_base::app};

ost.open(outputfile);
ost << "something you want to add to your outputfile";
ost.close();
return 0;
}

1
Truyền tên tệp cho hàm ofstreamtạo sẽ mở tệp ngay lập tức, vì vậy việc gọi open()sau đó là không cần thiết.
Rémy Lebeau

1

Tôi đã nhận được mã của mình cho câu trả lời từ một cuốn sách có tên "Lập trình C ++ trong các bước dễ dàng". Dưới đây có thể làm việc.

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    ofstream writer("filename.file-extension" , ios::app);

    if (!writer)
    {
        cout << "Error Opening File" << endl;
        return -1;
    }

    string info = "insert text here";
    writer.append(info);

    writer << info << endl;
    writer.close;
    return 0;   
} 

Tôi hy vọng cái này sẽ giúp bạn.


1

Bạn có thể sử dụng một fstreamvà mở nó với std::ios::appcờ. Có một cái nhìn vào mã dưới đây và nó sẽ xóa đầu của bạn.

...
fstream f("filename.ext", f.out | f.app);
f << "any";
f << "text";
f << "written";
f << "wll";
f << "be append";
...

Bạn có thể tìm thêm thông tin về các chế độ mở ở đây và về các dòng tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.