提问人:Fern M 提问时间:11/16/2017 更新时间:11/16/2017 访问量:37
读取文件后重写了字符串的值,该文件的名称是字符串的值
Value of string was rewritten after read a file which the name is the value of the string
问:
有 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;
}
答:
2赞
Some programmer dude
11/16/2017
#1
定义
string filenames[number]
无效,原因有二:
C++ 没有可变长度数组。解决方案是使用
std::vector
。在定义时,的值为零。因此,您尝试创建一个包含零个元素的数组,这是不允许的。解决此问题的方法是在获得 的最终值后进行定义。
number
number
你有同样的问题。words
仔细阅读代码,一个简单的解决方案是读入一个临时字符串,然后将字符串推入向量。有更紧凑和“C++”的解决方案,但推动循环是一个好的开始。filenames
也就是说,你的第一个循环可能是这样的
std::vector<std::string> filenames;
std::string filename;
while (content >> filename){
filenames.push_back(filename)
}
请注意,不再需要它,因为元素的数量可以通过 来获得。number
filenames.size()
你应该用 做类似的事情。words
评论
0赞
Fern M
11/16/2017
谢谢你的帮助,但是我们还没有学习向量,我们被要求将文件名和单词都存储在数组中,有什么方法可以使用数组来做到这一点吗?
0赞
Some programmer dude
11/16/2017
@FernM 然后,您必须事先设置一个固定的大小,并希望它足够大(但不要太大而浪费未使用的空间)。
评论
.c_str()
input.open
std::string