C ++读取txt的随机行?

时间:2011-06-29 01:12:37

标签: c++

我正在运行C ++代码,我需要从txt文件导入数据。 文本文件包含10,000行。每行包含n列二进制数据。

代码必须循环100,000次,每次必须从txt文件中随机选择一行,并将列中的二进制值分配给某些变量。

编写此代码的最有效方法是什么?我应该先将文件加载到内存中,还是应该随机打开一个随机行号?

如何在C ++中实现它?

4 个答案:

答案 0 :(得分:3)

要随机访问文本文件中的行,所有行都需要具有相同的字节长度。如果你没有,你需要循环,直到你得到正确的行。由于这种访问速度非常慢,因此最好将其加载到std::vector std::stringstd::getline中,每个条目为一行(这可以通过std::vector轻松完成)。或者,由于您要分配来自不同列的值,您可以使用struct MyValues{ double d; int i; // whatever you have / need }; std::vector<MyValues> vec; 和您自己的结构

std::vector

哪个可能更好,而不是一直解析该行。

使用{{1}},您可以获得随机访问权限,只需在整个文件中循环一次。

答案 1 :(得分:1)

10K行是一个非常小的文件。 如果你有每行100个字符,它将使用大量1MB的RAM。

将其加载到vector并按您希望的方式访问它。

答案 2 :(得分:0)

也许不是最有效的,但你可以试试这个:

int main() {
    //use ifstream to read
    ifstream in("yourfile.txt");

    //string to store the line
    string line = "";

    //random number generator
    srand(time(NULL));

    for(int i = 0; i < 100000; i++) {
        in.seekg(rand() % 10000);
        in>>line;
        //do what you want with the line here...
    }
}

我现在太懒了,但你需要确保检查你的ifstream是否存在文件结束,索引越界等错误......

答案 3 :(得分:0)

由于您只从10,000行采集100,000个样本,因此大多数行将被采样。将整个文件读入数组数据结构,然后随机采样数组。这样可以完全避免文件搜索。

更常见的情况是仅对文件数据的一小部分进行采样。为此,假设行的长度不同,请在文件中搜索随机点,跳到下一个换行符(例如cin.ignore( numeric_limits< streamsize >::max(), '\n' )),然后解析后续文本。