จะต่อท้ายข้อความในไฟล์ข้อความใน C ++ ได้อย่างไร?


180

จะต่อท้ายข้อความในไฟล์ข้อความใน C ++ ได้อย่างไร? และสร้างไฟล์ข้อความใหม่หากยังไม่มีอยู่และเพิ่มข้อความต่อท้ายหากมีอยู่


คำตอบ:


284

คุณต้องระบุผนวกโหมดเปิดเช่น

#include <fstream>

int main() {  
  std::ofstream outfile;

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

12
ไม่จำเป็นต้องปิดไฟล์ด้วยตนเองเช่นเดียวกับเมื่อทำลาย ดูstackoverflow.com/questions/748014 นอกจากนี้ <iostream> ไม่ได้ถูกใช้ในตัวอย่าง
swalog

6
คุณสามารถใช้ ios :: app แทน ios_base :: app
Trevor Hickey

4
สามารถใช้std::ofstream::out | std::ofstream::appแทนได้std::ios_base::appหรือไม่ cplusplus.com/reference/fstream/ofstream/open
Volomike

6
คุณยังสามารถทำอะไรได้มากกว่าในตัวสร้างหากคุณต้องการลดโค๊ดลงในโค้ด: std :: ofstream outfile ("test.txt", std :: ios_base :: app);
มาร์ช

คุณไม่จำเป็นต้องระบุการoutตั้งค่าสถานะอย่างชัดเจนเมื่อใช้std::ofstreamมันจะใช้การoutตั้งค่าสถานะโดยนัยสำหรับคุณเสมอ เดียวกันกับธงin std::ifstreamคุณจะต้องระบุinและตั้งoutค่าสถานะอย่างชัดเจนหากคุณใช้std::fstreamแทน
Remy Lebeau

12

ฉันใช้รหัสนี้ ทำให้แน่ใจว่าไฟล์นั้นถูกสร้างขึ้นหากไม่มีอยู่และยังเพิ่มการตรวจสอบข้อผิดพลาดอีกเล็กน้อย

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
นี่คือวิธี C ไม่ใช่ C ++
Dženan

3
@ Dzenan C เป็นเซตย่อยของ C ++ ไม่ทำให้วิธีการนี้ใช้ไม่ได้
Osaid

6
@Osaid C ไม่ใช่ชุดย่อยของ C ++ คอมไพเลอร์รวบรวมรหัสเพื่อความเข้ากันได้ย้อนหลัง หลายสิ่งที่ใช้ได้กับ C ไม่ใช่ C ++ - สิ่งที่ใช้ได้เช่น VLA
stryku

แต่ถ้าเราต้องการต่อท้ายข้อความที่อยู่ตรงกลางไฟล์? ด้วยสไตล์ C? ใช้ไฟล์ *? "a +" หรือ "a" กับ fseek () และ ftell () ไม่ได้ผลสำหรับฉัน
vincent thorpe

2

คุณสามารถทำได้เช่นนี้

#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
การส่งชื่อไฟล์ไปยังตัวofstreamสร้างจะเปิดไฟล์ทันทีดังนั้นการโทรopen()หลังจากนั้นจึงซ้ำซ้อน
Remy Lebeau

1

ฉันได้รหัสสำหรับคำตอบจากหนังสือที่ชื่อว่า "การเขียนโปรแกรม 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;   
} 

ฉันหวังว่านี่จะช่วยคุณได้


1

คุณสามารถใช้fstreamและเปิดด้วยการstd::ios::appตั้งค่าสถานะ ดูรหัสด้านล่างและควรล้างหัวของคุณ

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

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับโหมดการเปิดที่นี่และประมาณ fstreams ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.