C ++打开.txt文件并创建一个新文件

时间:2018-02-04 13:58:57

标签: c++ file

所以我试图创建一个程序,根据用户输入打开文本文件(或尝试失败),读取内容并创建一个以用户输入命名的新文本文件并重写内容,但是这次是行号。

我遇到了麻烦,我无法确定具体的内容。我的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();
    }
}

2 个答案:

答案 0 :(得分:0)

代码在这一行上做了什么:i实际上没有附加到向量 - 这是你想要做的 - 而是访问内部索引line的元素。向量,并尝试将line分配给它。 但这很好,因为向量的大小为0,它试图将resize分配给未知的内存。这会导致未定义的行为,并且通常会崩溃。
你可以做两件事之一。
第一种是使用reservewhile (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;

- 一些程序员老兄