2017-01-02 5 views
3

Скажем, у нас есть текстовый файл с таким содержимым:Looping над файлом, получите только одну строку

dogs 
cats 
bears 
trees 
fish 
rocks 
sharks 

это лишь слова, разделенные символом новой строки символов. Я пытаюсь создать аддон Node.js. Аддон будет читать файл и заменять соответствующие строки пустой строкой. Скажем, я передаю свою программу регулярному выражению, которое соответствует /trees/. Если я передаю файл в моей программе C++ он будет читать + запись в файл, и в результате:

dogs 
cats 
bears 

fish 
rocks 
sharks 

Прямо сейчас, проблема в том, что это не цикл через все строки в файле. У меня возникает ощущение, что открытие файла в режиме добавления и, следовательно, только начало в конце файла? Я не могу сказать. В любом случае, я хочу отредактировать файл на месте, а не усекать и переписать или заменить весь файл, потому что это прервет процессы, которые заканчивают файл.

Вот код:

#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) 

компилировать код, который вы, возможно, потребуется использовать Node.js инструментарий, который

node-gyp rebuild 

Если вы хотите помочь и хотите попробовать скомпилировать код, а затем дайте мне знать, потому что вам может понадобиться дополнительная информация. Но я новый C++ newb, и я думаю, что кто-то может помочь мне разобраться, не компилируя/не запуская код. Благодарю.

+2

Если у вас нет серьезных оснований для этого, я бы предложил открыть файл с помощью 'std :: ifstream', прочитывая содержимое файла за строкой, сохраняя преобразованные строки в' std :: vector ', закрывая файл, снова открывая файл, но используя' std :: ofstream', записывая содержимое 'std :: vector ', а затем закрывая файл. –

+0

уверен, возможно, потому, что запись в файл при циклировании содержимого всегда бит рискованна –

+0

@RSahu, но есть ли у вас какие-либо идеи, почему я только просматриваю цикл один раз для файла с несколькими строками текста? –

ответ

1

Чтобы ответить на вопрос о том, почему вы только читать одну строку из входного файла:

Ваше первое запись в файл, вероятно, устанавливает eofbit на поток, так что вторая getline() попытка не будет думать, что не имеет больше читать.

Комментарий от @RSahu описывает самый простой способ сделать это для текстовых файлов.

+0

спасибо за эту информацию, eofbit вещь мне не приходила –

Смежные вопросы