Скажем, у нас есть текстовый файл с таким содержимым: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, и я думаю, что кто-то может помочь мне разобраться, не компилируя/не запуская код. Благодарю.
Если у вас нет серьезных оснований для этого, я бы предложил открыть файл с помощью 'std :: ifstream', прочитывая содержимое файла за строкой, сохраняя преобразованные строки в' std :: vector ', закрывая файл, снова открывая файл, но используя' std :: ofstream', записывая содержимое 'std :: vector ', а затем закрывая файл. –
уверен, возможно, потому, что запись в файл при циклировании содержимого всегда бит рискованна –
@RSahu, но есть ли у вас какие-либо идеи, почему я только просматриваю цикл один раз для файла с несколькими строками текста? –