我正在编写一个练习程序,该程序将从文件中读取数据并将其格式化为可读。到目前为止,我有一些代码可以将标题与其下的数据分开。这是:
int main() {
ifstream in("records.txt");
ofstream out("formatted_records.txt");
vector<string> temp;
vector<string> headers;
for (int i = 0; getline(in,temp[i]); ++i) {
static int k = -1;
if (str_isalpha(temp[i])) {
headers[++k] = temp[i];
temp.erase(temp.begin() + i);
}
else {
temp[i] += "," + headers[k];
}
}
}
(str_isalpha()
只是一个将isalpha()
应用于字符串中每个字符的函数。)现在,这个程序中的for循环不执行,我无法弄清楚为什么。有人知道吗?
string line;
for (int i = 0; getline(in,line); ++i) {
temp.push_back(line);
仍然完全跳过for循环。
答案 0 :(得分:5)
vector<string> temp;
生成空向量。当您尝试读入temp[0]
时,这是未定义的行为。您应该将getline
的第二个参数作为单独的string
变量传递,在循环之前说string foo;
,然后将temp.push_back(foo);
作为循环体中的第一条指令。
答案 1 :(得分:4)
如果在确保您正在读取有效的字符串引用后循环仍未运行,则应检查您正在读取的流是否有效。例如,如果文件不存在或者您没有读取权限,则流将无效。当流无效时,getline
将无法读取任何内容。它的返回值是相同的流,当转换为bool
时,它的计算结果为false
。在继续之前检查流的状态。
ifstream in("records.txt");
if (!in.is_open()) {
std::cerr << "Uh-oh.\n";
return EXIT_FAILURE;
}