2017-01-02 1 views
3

Sagen wir eine Textdatei mit diesem Inhalt haben:über Datei Looping, erhalten nur eine Zeile

dogs 
cats 
bears 
trees 
fish 
rocks 
sharks 

das sind nur durch Newline-Zeichen getrennt Worte. Ich versuche ein Node.js Addon zu erstellen. Das Addon liest eine Datei durch und ersetzt übereinstimmende Zeilen durch eine leere Zeile. Sagen wir, ich gebe meinem Programm eine Regex, die mit /trees/ übereinstimmt. Wenn ich die Datei auf mein C++ Programm passieren liest es + in die Datei schreiben, und das Ergebnis in:

dogs 
cats 
bears 

fish 
rocks 
sharks 

Gerade jetzt ist das Problem, dass es nicht in der Datei durch alle Linien Looping. Ich habe das Gefühl, dass die Datei im Append-Modus geöffnet wird und daher erst am Ende der Datei beginnt. Ich kann es nicht sagen. Wie auch immer, ich möchte die Datei an Ort und Stelle bearbeiten, nicht die gesamte Datei abschneiden und neu schreiben oder ersetzen, weil dadurch Prozesse unterbrochen werden, die die Datei tailing sind.

Hier ist der Code:

#include <nan.h> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <iostream> 

using namespace std; 

void Method(const Nan::FunctionCallbackInfo<v8::Value>& info) { 
    info.GetReturnValue().Set(Nan::New("world").ToLocalChecked()); 
} 

void Init(v8::Local<v8::Object> exports) { 

fstream infile("/home/oleg/dogs.txt"); 

if(infile.fail()){ 
    cerr << " infile fail" << endl; 
    exit(1); 
} 

int pos = 0; 
string line; 

int count = 0; 
while (getline(infile, line)){  

// we only seem to loop once, even though the file has 7 or 8 items 

    count++; 
    long position = infile.tellp(); 
    cout << "tellp position is " << position << endl; 
    string str(line); 
    int len = str.length(); 

    cout << " => line contains => " << line << endl; 
    cout << " line length is " << len << endl; 

    std::string s(len, ' '); // create blank string of certain length 

    infile << s; // write the string to the current position 

    pos = pos + len; 
    cout << "pos is " << pos << endl; 


} 


cout << " => count => " << count << endl; 
infile.close(); 


    exports->Set(Nan::New("hello").ToLocalChecked(), 
       Nan::New<v8::FunctionTemplate>(Method)->GetFunction()); 
} 

NODE_MODULE(hello, Init) 

den Code kompilieren Sie Node.js Werkzeuge verwenden können müssen, die

node-gyp rebuild 

ist Wenn Sie helfen möchten wollen kompilieren, um zu versuchen der Code, dann lass es mich wissen, weil Sie mehr Informationen benötigen. Aber ich bin ein neuer C++ - Neuling und ich denke, dass jemand mir helfen kann, es herauszufinden, ohne den Code zu kompilieren/auszuführen. Vielen Dank.

+2

Wenn Sie nicht sehr starke Gründe haben, etwas anderes zu tun, würde ich vorschlagen, die Datei mit 'std :: ifstream' zu öffnen, den Inhalt der Datei zeilenweise zu lesen und die transformierten Zeilen in einem' std :: vector zu speichern ', schließt die Datei, öffnet die Datei erneut, verwendet aber' std :: ofstream', schreibt den Inhalt des 'std :: vector ' und schließt dann die Datei. –

+0

sicher, wahrscheinlich, weil das Schreiben in die Datei beim Überschreiben des Inhalts immer etwas riskant ist –

+0

@RSahu aber haben Sie eine Idee, warum ich nur für eine Datei mit mehreren Textzeilen die Schleife einmal durchlaufen werde? –

Antwort

1

Um Ihre Frage zu beantworten, warum Sie nur eine Zeile der Eingabedatei lesen:

Ihr erstes Schreiben in die Datei, um die eofbit auf dem Strom wahrscheinlich setzt, so dass der zweite getline() Versuch wird denken, dass es nicht mehr hat lesen.

Der Kommentar von @RSahu beschreibt die einfachste Möglichkeit, dies für Textdateien zu tun.

+0

danke für diese Info, die eofbit Sache ist mir nicht eingefallen –