所以我们有一个包含以下数据的文本文件:
年 - 制作 - 模型 - 价格
2011款雪佛兰Tahoe $ 30588
一切之间只有一个空间。价格前面有一个美元符号($)。我们仍然需要在代码中有里程,即使它不在数据文件中。我不知道为什么。
我如何从文本文件中获取此信息?
我尝试了很多方法,但似乎都没有。
以下是获取信息的代码:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <ctime>
#include "car.h"
using namespace std;
const int number=3;
const int maxPrice=25000;
int main()
{
int a;
string b; string c;
float d;
float e;
car cars [number];
int i, j;
float temp; //Price
int temp2; //Year
string temp3; //Make
string temp4; //Model
float temp5; //Miles
ifstream inFile; //declaring the File
inFile.open("carData.txt");
for(i=0; i<number; i++)
{
//cout << "Enter the YEAR of the car: ";
inFile >> a;
cars[i].setYear(a);
//cout << "Enter the MAKE of the car: ";
getline(inFile,b);
cars[i].setMake(b);
//cout << "Enter the MODEL of the car: ";
getline(inFile,c);
cars[i].setModel(c);
//cout << "Enter the number of MILES on the car: ";
inFile >> d;
cars[i].setMiles(d);
//cout << "Enter the PRICE of the car: ";
inFile >> e;
cars[i].setPrice(e);
//cout << " " << endl;
}
// ...
}
主要还在继续,这只是为了获取所有数据。我整天都遇到这个问题。我见过很多不同的方法。
答案 0 :(得分:0)
如果您使用标准解析函数,例如std :: fscanf,那么您可以 带走你的痛苦。你可以找到更多关于* scanf()和朋友的信息 来自http://en.wikipedia.org/wiki/Scanf_format_string和http://www.cplusplus.com/reference/cstdio/fscanf/。
我通常写C(或python,我不挑剔;&gt;)所以我想出了一些东西 像这样:
infile = open("datafile");
res = 0;
while (res != EOF) {
res = fscanf(infile, "%d %d %s %s %d",
&price, &year, &model, &model, &miles);
if (res < 0) {
/* error condition from fscanf() */
(void) fprintf(stderr, "error (%d) from fscanf: %s\n",
res, strerror(res));
exit(res);
}
}
[顺便说一句,这些运动的原因通常需要'里程'(这是 您提供的数据片段中的特色,它缺少最后一列)是因为 他们通常希望你建立在这些基于里程或车辆的汽车排名 公里旅行与价格与年龄相比]。
答案 1 :(得分:0)
好的,所以我知道它有点晚了但是如果你还没有这样做,那么这是一种实现你想要的结果的方法,用c ++
问题是std :: getline会在参数字符串中放入整行
所以如果你有这样的东西
std::getline(inFile, temp3)
temp3将具有以下值:“Year - Make - Model - Price”。
这也将光标设置为下一行,如果重复该功能
std::getline(inFile, temp3)
然后temp3将等于“”,因为第一个为空后的行(至少在您用作示例的文件中)。 现在要解决这个问题,你需要使用一个流作为流的字符串流,但是从a,鼓请读取它的值,字符串。
所以基本的想法是这样的: 1-&gt;转到包含该信息的行 2-&gt;使用字符串流来读取数据()
以下是该想法的实现:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
int a;
string b; string c;
float d;
float e;
//This assumes that the array is correctly initialized
car cars [number];
string tempLine;
ifstream inFile;
inFile.open("carData.txt");
//get the cursor past the first line that contains the column names
std::getline(inFile, tempLine)
//get the cursor past the second line that is blank
std::getline(inFile, tempLine)
//Now we are at the line that interests us
//I am assuming that the next lines don't have a blank line between them
unsigned int = 0;
int numberOfMiles;
while(std::getline(inFile, tempLine) && i<number)
{
std::stringstream iss(tempLine)
string tempPrice; //this will be the price value with the dollar sign
//you can also write in expanded form this read, but this works just fine
iss>>a>>b>>c>>numberOfMiles>>tempPrice; //notice that the price is now a string
tempPrice.erase(0,1)//this eliminates the dollar($) sign
std::stringstream iss1(tempPrice)//new stringstream as we need to read this string
iss1>>temp;//I believe this is your price variable
cars[i].setYear(a);
cars[i].setMake(b);
cars[i].setModel(c);
cars[i].setMiles(numberOfMiles);
cars[i].setPrice(temp); //i am assuming that this is how the function in called
i++;
}
}
希望这有帮助。