C ++ Читайте два разных файла с разными разделителями - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в программировании и был бы признателен за любую помощь в решении моей текущей проблемы: я хотел бы прочитать два разных файла: inputA и inputB, где один имеет этот разделитель ':', а другой ','. Цель состоит в том, чтобы получить значения для inputA и inputB и объединить их для вывода C. Я был в состоянии прочитать файлы по отдельности (и добавить их в двухмерный, либо массив dataA или dataB). Но я хочу объединить два моих сценария в один. Таким образом, идея заключается в том, что inputA является открытым getline с использованием ':', затем сохраняет значения в dataA, а пока inputB является открытым getline с использованием ',' и сохраняет в dataB. Вот как мой скрипт выглядит более мягким для чтения либо inputA, либо inputB:

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

using namespace std;

typedef vector <double> record_t;
typedef vector <record_t> data_t;

istream& operator >> ( istream& ins, record_t& record )
  {
  record.clear();
  string line;
    getline( ins, line );
  stringstream ss( line );
  string field;
  while (getline( ss, field, ':' )) // use ',' when inputB is supposed to be read
    {
    stringstream fs( field );
    double f = 0.0;
    fs >> f;
    record.push_back( f );
    }
  return ins;
  }

istream& operator >> ( istream& ins, data_t& data ) // here distinction between dataA or dataB?
  {
  data.clear();
  record_t record;
  while (ins >> record)
    {
    data.push_back( record );
    }
  return ins;
  }

int main( int argc, char* argv[] )
{
  data_t data;
  ifstream infile( "inputA.pgm" ); // and inputB.csv should be here
  infile >> data;
  if (!infile.eof())
    {
    cout << "file could not be opened\n";
    return 1;
    }
{
  infile.close();

//Output data
      ofstream myfile;
      myfile.open ("output.csv");
      myfile << data[1][1] << "," << data[2][1] << "," << data[3][1] << "\n"; //output dataA 
      myfile << data[1][1] << "," << data[2][1] << "," << data[3][1] << "\n"; //output dataB 
      myfile.close();

     return 0;
}
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Итак, я разработал ответ на свою проблему. Просто делаю fstream и getline для inputA, затем inputB. Теперь мне просто нужно преобразовать строки в двойные, а затем сохранить в массивы. Что я думаю, я должен справиться.

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

using namespace std;

int main()
{
    ifstream inA("inputA.txt");
    if(!inA.is_open())
        cout << "File could not be opened" << "\n";
    string dataA;

    while(inA.good()){
        getline(inA,dataA,',');

        cout << "dataA " << dataA << "\n";
    }
    inA.close();

    ifstream inB("inputB.txt");
    if(!inB.is_open())
        cout << "File could not be opened" << "\n";

    string dataB;

    while(inB.good()){
        getline(inB,dataB,':');

        cout << "dataB " << dataB << "\n";
    }
    inB.close();

}



0 голосов
/ 19 марта 2020

Ищите используемый разделитель следующим образом:

istream& operator >> ( istream& ins, data_t& data ) 
// here distinction between dataA or dataB? Yes it should happen here :D
{
    char delimiter = find_used_delimiter(ins);
    data.clear();
    record_t record;
    while (foo(ins, record, delimiter)) // use here a function where you read the record and pass the char-delimiter
        data.push_back( record );

   return ins;
}

char find_used_delimiter(istream& ins) {
    string line;
    std::size_t found = line.find_first_not_of("0123456789."); // search for first char, which is not a double char

   if (found!=std::string::npos)
   {
       std::cout << "The first non-double character is " << line[found];
       std::cout << " at position " << found << '\n';
       return line[found];
   }

   // here you should do some error handling, if there is no delimiter
}

istream& foo(istream& ins, record_t& record, char delimiter) {
    record.clear();
    string line;
    getline( ins, line );
    stringstream ss( line );
    string field;
    while (getline( ss, field, delimiter )) // use ',' when inputB is supposed to be read
    {
        stringstream fs( field );
        double f = 0.0;
        fs >> f;
        record.push_back( f );
    }
    return ins;
 }

Внимание, код не проверен и должен быть больше ориентиром. Для справки: find_first_not_of

...