从C ++中的文件中读取整数和字符

时间:2014-02-21 21:52:31

标签: c++

所以,我正在尝试编写一个可以从文件中读取数据的程序。 该文件由整数,字符和双精度组成。而且我必须能够将它们分配给不同的变量以进行进一步的计算(这实际上只是更大程序的一部分)。我在网上搜索过(这里也是),我看到了不同的解决方案。 stringstream,vector和诸如此类的东西。我最远的那个,在阅读时使用“skipws”。但我似乎无法正确阅读整数。

我更喜欢一种解决方案,它需要使用尽可能少的方法(流,获取等)。但如果我需要更多,我可以忍受它。

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

using namespace::std;

int main()
{
    int j = 0, kill = 0, i;
    char initials[10];
    int results[10];
    double avg;

    ifstream read("P1.txt");

    if (!read) //test to see if file can be opened.
    {
        cerr << "Error" << endl;
        exit(1);
    }

    while(kill != 1) //kill = 1 same as eof. Just my weird way of coding. 
    {
        switch (j)
        {
            case 0:     //read the first line of data, which is the chars.
                read >> skipws >> initials;
                j++;
                break;

            case 1: //read the second line of data, which is 10 integers and whitespace
                for (i=0;i<10;i++)
                read >> skipws >> results[i];
                j++;
                break;

            case 2:     //read the last line which is a single double.
                read >> skipws >> avg;
                j++;
                break;

            case 3: //check for end of file. 
                if(read.eof() == 0)
                    kill = 1;
                break;
        }
    }
    //the 3 lines below are just writing the contents of the file to the prompt. 
    //It's to check that values are stored correctly for further use. 
    cout << initials << endl; 
    cout << results << endl;
    cout << avg << endl;

    return 0;
}

我确切地知道y输入文件“P1.txt”会是什么样子,因为我自己在程序的另一部分创建它。它看起来像这样:

ccs
2 4 5 3 1 4 6 1 1 1
2.8       

这3行给了我一个球员的首字母,他的10场比赛的结果和他的平均分数。简而言之,一个玩家的数据。在最后的节目中,我需要能够读取10个玩家的价值。

我期待最后的3条cout线显示:

ccs
2453146111
2.8

现在,这是我已经得到的。 如果我将结果[10]声明为char,我可以在我的控制台中得到它:

ccs
2453146111ccs
2.8

如果我将其声明为int,我会得到这个

ccs
0x7fff5fbff6c0
2.8

显然,我可以看到价值没有得到妥善保存,而且有些事情已经无法控制,但我需要另一个人注意这一点。我没有线索了。

我知道这是做一个混乱的方式,它可以在更小的空间中完成,但我是新的C ++,所以这对我有意义,并使其很容易让我找到我的错误,直到现在。

我尽力解释它。这是我在这里的第一篇文章,所以如果您需要更多信息,请告诉我。

提前致谢!! 克里斯。

5 个答案:

答案 0 :(得分:1)

当结果是int [10]并且你做cout&lt;&lt;结果&lt;&lt; endl它将打印你应该循环的数组内存地址,在每次迭代中打印结果[i]。

for(i=0;i<10;i++){
      cout<< result[i]; 
}

它将给出正确的结果

答案 1 :(得分:1)

如果您使用C ++,我建议如下:

  • 创建三个stringstream s
  • 将每行读入一个stringstream
  • 对于每一行使用(当您stringstream被调用ss时):
    • ss >> cc你的角色)
    • ss >> ii您的整数)
    • ss >> dd你的双倍)
  • 当一行上有多个输入时,将值放在矢量中。

一些代码:

    string s[3] = {"ccs",
        "2 4 5 3 1 4 6 1 1 1",
        "2.8"
    };
    stringstream ss[3];

    /*
    Open file, get the first line into s[0], second into s[1] and third into s[2]
    */

    ss[0] << s[0];
    ss[1] << s[1];
    ss[2] << s[2];
    char c;
    int i;
    double d;

    vector<char> initials;
    vector<int> scores;
    vector<double> averages;

    while (ss[0] >> c) {
        cout << c << " ";
        initials.push_back(c);
    }
    cout << endl;
    while (ss[1] >> i) {
        cout << i << " ";
        scores.push_back(i);
    }
    cout << endl;
    while (ss[2] >> d) {
        cout << d << " ";
        averages.push_back(d);
    }
    cout << endl;

答案 2 :(得分:1)

由于您的数据采用已知格式,因此显着更容易。不要让这个浪费。

string initials;
vector<int> r(NUM_SCORES);
double avg;

现在获取数据:

ifstream infile;
infile.open(...);
while(infile >> initials){ // i.e. "while there's another player"
    for(int i=0; i<r.size(); i++) infile >> r.at(i);
    infile >> avg;
}

完成工作。

cout << "Player " << intials << " scored:" << endl;
for(int i=0; i<r.size(); i++) cout << r.at(i);
cout << endl << "giving him an average of " << avg << endl;

答案 3 :(得分:1)

此外,当您从文件中读取值时,它不是&#34; int&#34;数据类型。你不能把它推回到一系列的int并期望它能够工作,你可能需要使用类似std::stoi

之类的东西将它转换为int

答案 4 :(得分:1)

不要重新发明轮子,您可以使用Boost::tokenizer标记字符串并使用Lexical_cast将字符串转换为数字。

如果您想使用普通c,可以使用strtok来标记字符串