2015-06-04 35 views
7

Bu bence oldukça basit olmalı, ancak benim googling'im şu ana kadar yardımcı olmadı ... C++ 'da var olan bir dosyaya yazmam gerekiyor, fakat mutlaka dosyanın sonunda.C++ 'da bir dosyanın ortasına nasıl yazılır?

Sadece dosyama metin eklemek istediğimde, akım nesnesimde open numaralı telefonu çağırırken bayrağı ios:app iletebilirim. Ancak, bu sadece dosyanın sonuna kadar yazmamı, ama ortalarına değil.

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 

    string path = "../test.csv"; 

    fstream file; 
    file.open(path); // ios::in and ios::out by default 

    const int rows = 100; 
    for (int i = 0; i < rows; i++) { 
    file << i << "\n"; 
    } 

    string line; 
    while (getline(file, line)) { 
    cout << "line: " << line << endl; // here I would like to append more text to certain rows 
    } 


    file.close(); 

} 
+0

Dizinlenmiş bir dosya kitaplığı kullanmak isteyebilirsiniz (örneğin [GDBM] (http://www.gnu.org.ua/software/gdbm/) veya [sqlite] (http://sqlite.org/) , ya da tam teşekküllü bir veritabanı ([PostgreSQL] (http://postgresql.org/), [MongoDB] (http://mongodb.org/) ....) –

+0

Dosyaları değiştirmenin standart yolu: okuma girişi dosya, süreç, yeni çıktı dosyasına yazılırsa, çıktı dosyası ile giriş dosyasının üzerine yazılır. "Daha hızlı" alternatifler vardır (ios :: app gibi), ancak her durum için değildir. – stefaanv

+5

Bu daha önce milyonlarca kez istenmemiş mi? –

cevap

11

Dosyanın ortasında yerleştiremez:

Sorunu göstermek için kısa bir program yaptı. Eski dosyayı yeni bir dosyaya kopyalamanız ve yeni dosyaya kopyalama sırasında ortada istediğinizi eklemeniz gerekir.

Aksi takdirde, varolan dosyada veri/satırların üzerine yazmak isterseniz, dosya içindeki konumu tanımlamak için std::ostream::seekp() kullanabilirsiniz.

+5

Sadece tamamlanmak için : Bir dosyanın ortasına _insert_ yapamazsınız, ancak üzerine yazarak, aynı sayıda baytlık _replace_. Daha fazla tamamlamak için –

+0

, örnek kod bakın; http://stackoverflow.com/questions/2393345/how-to-append-text-to-a-text-file-in-c – Anil

+1

temel olarak, dosya işaretçisini seekp() üye işlevini kullanarak herhangi bir yere taşıyabilir ve yazı. Ancak, EOF'den önceki tüm yazmalar eski verilerin yerini alacaktır. – 911