C ++从文本文件中读取数据

时间:2014-02-18 16:58:04

标签: c++ string

我有以下数据:

$GPVTG,,T,,M,0.00,N,0.0,K,A*13

我需要读取数据,但是逗号之间有空白,因此我不确定应该如何读取数据。

另外,如何仅为一组数据选择GPVTG?例如:

GPVTG,,T,,M
GPGGA,184945.00
GPRMC,18494
GPVTG,,T,,M,0
GPGGA,184946.000,3409

我尝试过使用:

 /* read data line */
 fgets(gpsString,100,gpsHandle);
 char type[10] = "GPVTG";
 sscanf(gpsString," %GPVTG", &type);
 if (strcmp(gpsString, "GPTVG") == 0){
   printf("%s\n",gpsString);
 }

3 个答案:

答案 0 :(得分:0)

如果您想使用基于fstream的C ++样式代码:

fin.open(input);

cout << "readed";

string str;

getline(fin, str); // read one line per time

答案 1 :(得分:0)

这个怎么样

#include <istream>
#include <sstream>

class CSVInputStream {
public:
  CSVInputStream(std::istream& ist) : input(ist) {}
  std::istream& input; 
};

CSVInputStream& operator>>(CSVInputStream& in, std::string& target) {
  if (!in.input) return in;
  std::getline(in.input, target , ',');
  return in;
}

template <typename T>
CSVInputStream& operator>>(CSVInputStream& in, T& target) {
  if (!in.input) return in;
  std::string line;
  std::getline(in.input, line , ',');
  std::stringstream translator;
  translator << line;
  translator >> target;
  return in;
}

//--------------------------------------------------------------------
// Usage follow, perhaps in another file
//--------------------------------------------------------------------

#include <fstream>
#include <iostream>

int main() {
  std::ifstream file;
  file.open("testcsv.csv");
  CSVInputStream input(file);
  std::string sentence_type;
  double track_made_good;
  char code;
  double unused;
  double speed_kph;
  char speed_unit_kph;
  double speed_kmh;
  char speed_unit_kmh;
  input >> sentence_type >> track_made_good >> code;
  input >> unused >> unused;
  input >> speed_kph >> speed_unit_kph;
  input >> speed_kmh >> speed_unit_kmh;
  std::cout << sentence_type << " - " << track_made_good << " - ";
  std::cout << speed_kmh << " " << speed_unit_kmh << " - ";
  std::cout << speed_kph << " " << speed_unit_kph << std::endl;;
}

这将逗号分隔与值的读取分开,并且可以重复使用 大多数其他逗号分隔的东西。

答案 2 :(得分:0)

这就是我要做的事情

#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;

vector<string> &split(const string &s, char delim, vector<string> &elems) {
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

vector<string> split(const string &s, char delim) {
    vector<string> elems;
    split(s, delim, elems);
    return elems;
}


int main()
{

    ifstream ifs("file.txt");

    string data_string;

    while ( getline( ifs, data_string ) )
    {
            //i think you'd want to erase first $ charachter
        if ( !data_string.empty() ) data_string.erase( data_string.begin() );

            //now all data put into array:
        vector<string> data_array = split ( data_string, ',' );

        if ( data_array[0] == "GPVTG" )
        {
            //do whatever you want with that data entry
            cout << data_string;
        }
    }

    return 0;
}

应该处理你的任务。所有空元素都将为数组中的空“”字符串。询问您是否还需要其他任何东西。

拆分功能的积分属于Split a string in C++?回答。