C ++文件到数组之间的问题

时间:2015-06-07 02:14:54

标签: c++

我正在处理一项任务,从.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;
    }
}

然而,当代码读取行数,使用它作为数组的大小,然后打印随机单词之间似乎出现了问题。

3 个答案:

答案 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