如何从文本文件中解析一行

时间:2014-02-03 03:18:13

标签: c++ int text-files ifstream getline

所以我们有一个包含以下数据的文本文件:

年 - 制作 - 模型 - 价格

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;
    }

    // ...
}

主要还在继续,这只是为了获取所有数据。我整天都遇到这个问题。我见过很多不同的方法。

2 个答案:

答案 0 :(得分:0)

如果您使用标准解析函数,例如std :: fscanf,那么您可以 带走你的痛苦。你可以找到更多关于* scanf()和朋友的信息 来自http://en.wikipedia.org/wiki/Scanf_format_stringhttp://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++;
    }

}

希望这有帮助。