2014-02-18 5 views
0

У меня есть следующие данные:C++ чтение из данных из текстового файла

$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); 
} 
+0

Просьба уточнить. Что такое «пробелы» между запятыми? Я не вижу никаких пробелов в данных примера, которые вы предоставили. Вы имеете в виду пустые поля в записи CSV? – jia103

+1

Вы отметили его C++, но выложили C, на который вы хотите получить ответ? – dutt

+0

@ jia103 Я думаю, что он означает '' '' 'между ними' ,, ' – yizzlez

ответ

0

Если вы хотите использовать C++ код стиля, основанного на fstream:

fin.open(input); 

cout << "readed"; 

string str; 

getline(fin, str); // read one line per time 
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;; 
} 

Это отделяет запятую разделение от чтения значений и может быть повторно использовано на большинство других разделенных запятыми материалов.

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++? ответам.

+0

полный ответ сейчас – user1849353

Смежные вопросы