我正在运行C ++代码,我需要从txt文件导入数据。 文本文件包含10,000行。每行包含n列二进制数据。
代码必须循环100,000次,每次必须从txt文件中随机选择一行,并将列中的二进制值分配给某些变量。
编写此代码的最有效方法是什么?我应该先将文件加载到内存中,还是应该随机打开一个随机行号?
如何在C ++中实现它?
答案 0 :(得分:3)
要随机访问文本文件中的行,所有行都需要具有相同的字节长度。如果你没有,你需要循环,直到你得到正确的行。由于这种访问速度非常慢,因此最好将其加载到std::vector
std::string
个std::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' )
),然后解析后续文本。