循环遍历文件,只获得一行

时间:2017-01-02 03:36:02

标签: c++ node.js node.js-addon

假设我们有一个包含以下内容的文本文件:

dogs
cats
bears
trees
fish
rocks
sharks

这些只是由换行符分隔的单词。我正在尝试创建一个Node.js插件。 Addon将读取文件并用空行替换匹配的行。假设我将程序传递给匹配/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,我想有人可以帮助我弄清楚,而无需编译/运行代码。感谢。

1 个答案:

答案 0 :(得分:1)

回答您关于为什么只阅读输入文件的一行的问题:

您对文件的第一次写入可能会在流上设置eofbit,因此第二次getline()尝试会认为它没有更多内容可供阅读。

来自@RSahu的评论描述了为文本文件执行此操作的最简单方法。