我正在处理一项任务,从.txt文档中的名称列表中取出数据(每行一个,每个以逗号结尾)。
我想要的是:
计算有多少行
使用计数来定义数组的大小以容纳单词
从列表中选择两个随机单词并打印出来。
这是我的代码:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
srand(time(NULL));
int j;
int rand1 = rand() % 5;
int rand2 = rand() % 5;
ifstream myfile ("NAMES.txt");
if (myfile.is_open()) {
myfile.unsetf(ios_base::skipws);
unsigned line_count = count(
istream_iterator<char>(myfile),
istream_iterator<char>(),
'\n');
j = line_count;
cout << j << endl;
string *MN1 = new string[j];
for(int i = 0; i <= j; i++) {
getline(myfile, MN1[i], ',');
}
cout << rand1 << endl;
cout << MN1[rand1] << " " << MN1[rand2] << endl;
}
else {
cout << "Unable to open file" << endl;
}
}
然而,当代码读取行数,使用它作为数组的大小,然后打印随机单词之间似乎出现了问题。
答案 0 :(得分:2)
没有必要将文件解析两次,并且您可以使用myfile.ignore忽略尾随的最终行,否则会污染您的输出。它也没有必要在堆上分配你的字符串,这通常是最好的避免。这是使用此技术的示例解决方案。
#include <fstream>
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
int main()
{
srand(time(NULL));
int j;
int rand1 = rand() % 5;
int rand2 = rand() % 5;
ifstream myfile("NAMES.txt");
if (myfile.is_open()) {
myfile.unsetf(ios_base::skipws);
string str;
for (int i = 0; !myfile.eof(); i++)
{
getline(myfile, str, ',');
myfile.ignore(1);
if (i == rand1 || i == rand2) {
cout << str << endl;
}
}
}
else {
cout << "Unable to open file" << endl;
}
}
答案 1 :(得分:1)
第一个迭代器完全读取文件。之后您必须回放文件,以便再次阅读。
myfile.clear(); // reset file states
myfile.seekg(0); // go back to the the beginning
for(int i = 0; i<=j; i++)
....
答案 2 :(得分:0)
我建议您使用vector <std::string>
而不是字符串数组,这样您就可以从文件中读取所有行到内存中,然后计算行数。
std::vector <std::string> MN1;
阅读行:
for ( std::string line; std::getline ( myfile, line );)
{
MN1.push_back ( line );
}
计算行数:
j = MN1.size ( );
我建议你不要使用关键字new
,除非有必要,如果你用关键字new
分配内存,你也必须在不再使用时清理它,这样就完成了使用关键字delete
。