2014-10-11 2 views
0

Для моего класса comp sci мне пришлось создать программу, которая (просто ставит) обрабатывает сотрудников. До этого момента у меня не было проблем. Тем не менее, последняя часть задания - «Создать тестовую программу, которая обрабатывает массив из 5 сотрудников, которые вводятся из текстового файла, а затем выводятся как отчет сотрудника на экран». Я думал, что это будет относительно легко, в конце концов, насколько сложно разобрать текстовый документ. Проблема в том, что мне нужно вводить как строки, так и ints, и они не имеют никакого простого шаблона или разделения. Функция, которая у меня есть для ввода данных выглядит следующим образом:Каким будет лучший способ читать данные из текстового файла с помощью ints и строк в C++?

void employeeType::setEmployeeType(string first, string middle, string last, 
           int month, int day, int year, int ID, 
           string street, string town, string state, int zip, string county, string country, 
           int home, int cell, string email, 
           int sMonth, int sDay, int sYear, 
           string oStreet, string oTown, string oState, int oZip, string oCounty, string oCountry, 
           int work, int salary) {//code here..} 

И один из моих входов из текстового документа:

William, R, Smith, 8, 24, 1963, 555238911, 12345 Street1, State1, 77123, County1, Country1, 1112223333, 3332221111, [email protected], 3, 19, 2007, 12345 oStreet1, oTown1, oState1, 77987, oCounty1, oCountry1, 2221113333, 75000 

я планировал на разделении каждого входа, обнаруживая каждый «» который завершит каждый вход. Я всегда мог бы жестко закодировать его так, чтобы определенные входы (входные номера 4, 5, 6, 7, 10, 13, 14, 16, 17, 18, 22, 23 и 24) анализировались как ints, но это не было бы выглядят очень хорошо, и, вероятно, лучший способ сделать это. У кого-нибудь есть предложение?

Я всегда могу предоставить любую дополнительную информацию.

+7

Я бы серьезно подумал о том, чтобы поместить все эти параметры в 'struct' и передать ссылку на тип объекта этой' struct'. – Galik

+1

После «12345 Street1» город отсутствует? –

+0

Другое дело, я думал, что если я добавлю какой-то особый символ перед int (вместо 123 это будет что-то вроде & 123), и перед сохранением его как строки я бы проверил, является ли & первым символом строки и если да, это int. Я не понимаю, почему это сработает. Определенно не лучшая практика, но для задания, которое фокусируется на других классах, она должна принять это. –

ответ

1

Это решение определяет новое белое пространство, которое соответствует комасам (,). Я также определяю структуру данных, но это необязательно. Наконец, он использует поток ifstream для получения данных внутри структуры.

Более подробная информация в следующем тексте: http://en.cppreference.com/w/cpp/locale/ctype_char

#include <iostream> //to output results 
#include <vector> //for the whitespace 
#include <fstream> //to open the file 
#include <string> //strings 
using namespace std;//Avoid that in real projects 

// Define a new type of white-space that mach comas (,) 
struct my_whitespace : std::ctype<char> 
{ 
    static const mask* make_table() 
    { 
     // make a copy of the "C" locale table 
     static std::vector<mask> v(classic_table(), 
      classic_table() + table_size); 
     // these will be whitespace 
     v[','] |= space; 
     // space and tab won't be whitespace 
     v[' '] &= ~space; 
     v['\t'] &= ~space; 
     return &v[0]; 
    } 
    my_whitespace(std::size_t refs = 0) : 
     std::ctype<char>(make_table(), false, refs) {} 
}; 

// Data structure to save each line of the file (optional) 
struct Data 
{ 
    string first; 
    string middle; 
    string last; 
    int month; 
    int day; 
    int year; 
    int ID; 
    string street; 
    //... 
}; 

// Main function, in real project, get that outside the main.  
int main() 
{ 
    // Open the file 
    ifstream file ("file.txt", ios::in); 
    // Set the white-space to mache comas 
    my_whitespace *ws = new my_whitespace(); 
    file.imbue(std::locale(file.getloc(), ws)); 
    if (file.is_open()) 
    { 
     Data d; 
     // For each line of the file 
     while (file) 
     { 
      char s; // To skip the first space after the coma. 
      // Read one line of the file. 
      file >> 
       d.first >> 
       s >> d.middle >> 
       s >> d.last >> 
       s >> d.month >> 
       s >> d.day >> 
       s >> d.year >> 
       s >> d.ID >> 
       s >> d.street //>> 
       /*...*/ 
       ; 
      // Print the result (optional) 
      cout << d.first << endl; 
      cout << d.middle << endl; 
      cout << d.last << endl; 
      cout << d.month << endl; 
      cout << d.day << endl; 
      cout << d.street << endl; 
      //... 
     } 
    } 
    file.close(); // This function delete ws 
    // delete ws; 

    return 0; 
} 

Примечание: Будьте осторожны с запятыми внутри строкового поля.

+0

Спасибо, Адриан. –