读取文件后重写了字符串的值,该文件的名称是字符串的值

Value of string was rewritten after read a file which the name is the value of the string

提问人:Fern M 提问时间:11/16/2017 更新时间:11/16/2017 访问量:37

问:

有 5 个 txt 文件,其中一个 (“table_of_content.txt”) 包含其他四个 txt 文件的名称,每四行连续。在其他四个文件中,每个文件都包含一行句子。

读取表 txt 并使用数组恢复字符串(其他文件的名称)没有问题。

但是在我尝试使用 getline 之后。() 恢复其他四个文件中的句子,filenames[number],应该恢复四个文件名称的字符串被重写,它与恢复句子的 words[number] 相同。

我真的很困惑,哪个部分错了?

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

int main (){
    ifstream content;
    content.open("table_of_content.txt");
    if (content.fail()){
        cout<< "fails";
        return 0;
    }
    int number = 0, i = 0;
    string filenames[number], words[i];
    while (content >> filenames[number]){
        number++;
    }
    content.close();
    cout << number << " students' files are read" << endl;
    // read table_of_content.txt  
    ifstream input;
    while (i < number){
        input.open(filenames[i].c_str());
        getline(input, words[i]);
        // after this getline, filenames become words
        input.close();
        i++;
    }
    cout << filenames[2] << endl << words[3] << endl;
    return 0;
}
C++ 数组字符串 IOSTREAM getLine

评论

1赞 Caleth 11/16/2017
吹毛求疵:你不需要 in,它有一个过载.c_str()input.openstd::string

答:

2赞 Some programmer dude 11/16/2017 #1

定义

string filenames[number]

无效,原因有二:

  1. C++ 没有可变长度数组。解决方案是使用 std::vector

  2. 在定义时,的值为。因此,您尝试创建一个包含零个元素的数组,这是不允许的。解决此问题的方法是在获得 的最终值进行定义。numbernumber

你有同样的问题。words


仔细阅读代码,一个简单的解决方案是读入一个临时字符串,然后将字符串推入向量。有更紧凑和“C++”的解决方案,但推动循环是一个好的开始。filenames

也就是说,你的第一个循环可能是这样的

std::vector<std::string> filenames;
std::string filename;
while (content >> filename){
    filenames.push_back(filename)
}

请注意,不再需要它,因为元素的数量可以通过 来获得。numberfilenames.size()

你应该用 做类似的事情。words

评论

0赞 Fern M 11/16/2017
谢谢你的帮助,但是我们还没有学习向量,我们被要求将文件名和单词都存储在数组中,有什么方法可以使用数组来做到这一点吗?
0赞 Some programmer dude 11/16/2017
@FernM 然后,您必须事先设置一个固定的大小,并希望它足够大(但不要太大而浪费未使用的空间)。