所以,我正在尝试编写一个可以从文件中读取数据的程序。 该文件由整数,字符和双精度组成。而且我必须能够将它们分配给不同的变量以进行进一步的计算(这实际上只是更大程序的一部分)。我在网上搜索过(这里也是),我看到了不同的解决方案。 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 ++,所以这对我有意义,并使其很容易让我找到我的错误,直到现在。
我尽力解释它。这是我在这里的第一篇文章,所以如果您需要更多信息,请告诉我。
提前致谢!! 克里斯。
答案 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 >> c
(c
你的角色)ss >> i
(i
您的整数)ss >> d
(d
你的双倍)一些代码:
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
答案 4 :(得分:1)
不要重新发明轮子,您可以使用Boost::tokenizer标记字符串并使用Lexical_cast将字符串转换为数字。
如果您想使用普通c,可以使用strtok来标记字符串