我有一个数字网格的大文件(50x11k)。我想要做的就是将值放入向量中,以便我可以同时访问不同行的值。我每次都会得到一个seg错误(我甚至不能在while循环之前做一个cout)。有谁看到这个问题?
如果有更简单的方法,请告诉我。它是一个大文件,我需要能够将一行的值与另一行进行比较,因此一个简单的getline不起作用,有没有办法跳转文件而不是“抓住”这些行,而只是“检查”我可以稍后通过输入那个数字来检查同一行吗?喜欢像大阵列一样看文件?我想看看那一行中的第三行和第5个字符,同时我看第56行和第9个字符,就像那样。
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
//int g_Max = 0;
int main() {
vector<vector<string> > grid;
ifstream in("grid.txt");
int row = 0;
int column = 0;
string c;
if (!in) {
cout << "NO!";
}
while (!in.eof()) {
c = in.get();
if ( c.compare("\n") == 0) {
row++;
column = 0;
}
else {
c = grid[column][row];
cout << grid[column][row];
column++;
}
}
return 0;
}
答案 0 :(得分:2)
vector<vector<string> > grid;
这声明了一个空的向量,没有元素。
c = grid[column][row];
这可以访问向量的元素,但没有元素。
如果您将其更改为使用vector::at()
而不是vector::operator[]
,请执行以下操作:
c = grid.at(column).at(row);
然后你会得到例外,告诉你你的访问范围超出范围。
您需要先使用元素填充矢量,然后才能访问它们。一种方法是预先用正确数量的元素声明它:
vector<vector<string> > grid(11000, std::vector<string>(50));
您可能还想修复IO循环,测试!in.eof()
通常是错误的。为什么不一次读一行并分割线,而不是读单个字符?
while (getline(in, c))
答案 1 :(得分:0)
如果您只需要一次访问所有行,为什么不将其声明为std::vector<std::string>
并且每行都是string
??
std::string s;
std::vector<std::string> lines;
while( std::getline(in, s) ) lines.push_back( s );
std::cout << "File contain " << lines.size() << " line" << std::endl;
std::cout << "Char at [1][2] is " << lines[1][2] << std::endl; // assume [1][2] is valid!