在C ++中拆分文本行的最有效方法是什么?

时间:2014-07-19 09:35:43

标签: c++ file-io inputstream stringstream

我正在处理一些文本文件,我需要读取所有行,我需要在这些行中找到字符串。我使用了类似下面的方法(假设每行有4个字符串):

string word1 , word2, word3, line;
while( getline( inputFile,line )){

    stringstream row(line);
    row>>word1>>word2>>word3>>word4;

}

然而,结果非常低效,我的程序运行速度不是很快。我该如何改进方法?提前谢谢!

2 个答案:

答案 0 :(得分:0)

不要使用getline和string stream 使用读取函数

读取大块/数据块中的所有字符串
ifstream file ("file.txt", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
    file.seekg(0, ios::end);
    int block_size = file.tellg();
    char *contents = new char [block_size];
    file.seekg (0, ios::beg);
    file.read (contents, block_size);
    file.close();

    //... now deal with the string (I/O operations take more time once the entire 
    // file is in RAM it will be faster to operate on )

    delete [] contents;
}

如果您的文件大小超过堆内存的限制,则必须读取预定义的块大小并对其进行操作并释放内存并转到下一个块

Suggestion

答案 1 :(得分:0)

我看到两个变种。 我在这样的文件上比较了所有三种变体(你的和2个地雷):

(bash)for((i = 0; i <100000; ++ i));回声&#34; $ i $ i $ i $ i&#34 ;;完成&gt;的test.txt

test.txt放在tmpfs中。 所有时间都以秒为单位。

你的变种: CPU时间0.130000,绝对时间0.135514

我的变体1: CPU时间0.060000,绝对时间0.062909,

我的变种2: CPU时间0.050000,绝对时间0.052963

1)&#34; C模式&#34;:

//FILE *in  
char buf[1000];
buf[sizeof(buf) - 1] = '\0';
char w1[sizeof(buf)];
char w2[sizeof(buf)];
char w3[sizeof(buf)];
char w4[sizeof(buf)];
while (fgets(buf, sizeof(buf) - 1, in) != nullptr) {
    *w1 = *w2 = *w3 = *w4 = '\0';
    sscanf(buf, "%s %s %s %s", w1, w2, w3, w4);//here should be check for == 4
    //words.emplace_back(std::string(w1), std::string(w2), std::string(w3), std::string(w4));
}

2)&#34;映射文件&#34;:

//MapFile in;
const char *beg = in.begin();
const char *end = beg + file_size;
std::string w[4];
const char *ptr = beg;
bool eof = false;
do {
    for (int i = 0; i < 4; ++i) {
        const char *q = find_end_of_word(ptr, end);
        w[i].assign(ptr, q - ptr);
        if (q == end) {
            eof = true;
            break;
        }
        ptr = q;
        while (ptr != end && (*ptr == ' ' || *ptr == '\t' || *ptr == '\n'))
            ++ptr;
        if (ptr == end) {
            eof = true;
            break;
        }
    }
    //words.emplace_back(w[0], w[1], w[2], w[3]);

// printf(&#34;%s%s%s%s \ n&#34;,w [0] .c_str(),w [1] .c_str(),w [2] .c_str( ),w [3] .c_str());     } while(!eof);