所以我试图创建一个程序,根据用户输入打开文本文件(或尝试失败),读取内容并创建一个以用户输入命名的新文本文件并重写内容,但是这次是行号。
我遇到了麻烦,我无法确定具体的内容。我的Qt Creator没有发出大量错误,但程序似乎在第30行停止而没有任何错误消息。
在线C ++编译器抱怨分段问题。
代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string input_file = "";
cout << "input file: ";
getline(cin, input_file);
vector<string> line_vector;
string output_file = "";
cout << "output file:";
getline(cin, output_file);
ifstream file_object(input_file);
if ( not file_object )
{
cout <<"Error! The file " << input_file <<
" cannot be opened." << endl;
} else {
int row_number = 0;
string line;
while (getline(file_object, line) )
{
cout << line << endl;
line_vector[row_number] = line;
++row_number;
}
file_object.close();
ofstream output_file;
output_file.open("");
for (int i = 0; i>=row_number;++i)
{
output_file << i << " " << line_vector[i] << "\n";
}
output_file.close();
}
}
答案 0 :(得分:0)
代码在这一行上做了什么:i
实际上没有附加到向量 - 这是你想要做的 - 而是访问内部索引line
的元素。向量,并尝试将line
分配给它。
但这很好,因为向量的大小为0,它试图将resize
分配给未知的内存。这会导致未定义的行为,并且通常会崩溃。
你可以做两件事之一。
第一种是使用reserve
或while (getline(file_object, line) ) {
cout << line << endl;
line_vector.resize(row_number + 1);
line_vector[row_number] = line;
++row_number;
}
来保留向量的内存,然后分配变量,如下所示:
push_back
然而,这是毫无意义的,相反,您应该使用while (getline(file_object, line) ) {
cout << line << endl;
line_vector.push_back(line);
}
:
row_number
在该循环中无效使用using namespace std
哦,不要使用{{1}},这是一个坏习惯。
答案 1 :(得分:-1)
&#34;当你定义一个像line_vector这样的矢量时,它会从空开始。所有索引都将超出范围并导致未定义的行为。请学习如何将元素推回到矢量中。 &#34;
- 一些程序员老兄