Чтение ввода из текстового файла в массив в C ++ - PullRequest
0 голосов
/ 05 ноября 2010

Хорошо, будьте нежны, так как я очень новичок в программировании. До сих пор я изучал только C ++ и использую Visual Studio 2010 в качестве моего компилятора. Для этой программы я пытаюсь прочитать текстовый файл ввода и записать информацию в набор из трех массивов. Один массив будет обрабатывать список имен, а два других - за отработанные часы и почасовую оплату соответственно. Я буду использовать последние два, чтобы вычислить набор доходов и вывести все это в другой текстовый файл в виде отчета. Моя проблема, однако, заключается в получении входных данных для первого массива. Входной файл, который я использую, имеет следующий текст:

J. Доу * 35 12.50 J. Рассвет * 20 10,00 .........

Имена сопровождаются звездочками, так как я пытаюсь использовать ifstream getline для получения имен со звездочками, выступающими в качестве разделителей, и записи следующих двух чисел в два других массива. Последние два значения разделены пробелами, поэтому я не думаю, что они вызовут какие-либо проблемы. Я уверен, что есть другие ошибки, требующие обработки, но мне нужно разобраться с первой ошибкой, прежде чем я смогу начать отладку остальных.

Моя проблема возникает со строкой, где я вызываю inFile.getline, так как я получаю следующую ошибку: ошибка C2664: 'std :: basic_istream <_Elem, _Traits> & std :: basic_istream <_Elem, _Traits> :: getline (_Elem *, std :: streamsize, _Elem) ': невозможно преобразовать параметр 1 из' std :: string 'в' char * '.

Из того, что я читал в другом месте, (я думаю) проблема связана с попыткой записать строку в массив char, который не будет работать, поскольку они имеют разные типы данных. Я не уверен, существуют ли другие возможные методы получения имен, так как мне нужен разделитель, чтобы отделить имена от числовых значений. Любые советы о том, как решить эту проблему, будут высоко оценены.

Вот источник, который я написал:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

const int EMP_NUM = 5;
const int BASE_HOURS = 40;
const char N_SIZE = 8;

int main()
{
 int i;
 double rEarnings, oEarnings, tEarnings,
 trEarnings, toEarnings, ttEarnings;
 ifstream inFile;
 ofstream outFile;
 inFile.open("records.txt");
 outFile.open("report.txt");

 outFile << setprecision(2) << showpoint << fixed;

 outFile << setw(50) << "Payroll Report" << "\n\n";
 outFile << "EMPLOYEE NAME" << setw(25) << "REGULAR EARNINGS" << setw(25) << "OVERTIME EARNINGS" << setw(25) << "TOTAL EARNINGS" << endl;

 string nameAr[EMP_NUM];
 int hoursAr[EMP_NUM];
 double hrateAr[EMP_NUM];

 for (int i = 0; i < EMP_NUM; i++) // Get input from our input file.
 {
  inFile.getline(nameAr[i], EMP_NUM, "*");
  inFile >> hoursAr[i] >> hrateAr[i];
 }

 for (int i = 0; i < EMP_NUM; i++) // Make the calculations to be sent to our report.
 {
  char nameAr[N_SIZE];
  int hoursAr[N_SIZE];
  double hrateAr[N_SIZE];

  if (hoursAr[i] > 40) // For employees with overtime hours.
  {
  // double rEarnings, double oEarnings, double tEarnings,
  // double trEarnings, double toEarnings, double ttEarnings;
  // rEarnings = 0, oEarnings = 0, tEarnings = 0,
  // trEarnings = 0, toEarnings = 0, ttEarnings = 0;

   rEarnings = BASE_HOURS * hrateAr[i];
   oEarnings = (hoursAr[i] - BASE_HOURS) * hrateAr[i] * 1.5;
   tEarnings = rEarnings + oEarnings;
   trEarnings += rEarnings;
   toEarnings += oEarnings;
   ttEarnings += tEarnings;
   outFile << left << nameAr[i];
   // << setw(25) << right << rEarnings << setw(25) << right << oEarnings << setw(25) << right << tEarnings << endl;

  } 
  else // For employees without overtime hours.
  {
  // double rEarnings, double oEarnings, double tEarnings,
  // double trEarnings, double toEarnings, double ttEarnings;
  // rEarnings = 0, oEarnings = 0, tEarnings = 0,
  // trEarnings = 0, toEarnings = 0, ttEarnings = 0;

   rEarnings = hoursAr[i] * hrateAr[i];
   oEarnings = 0;
   tEarnings = rEarnings + oEarnings;
   trEarnings += rEarnings;
   toEarnings += oEarnings;
   ttEarnings += tEarnings;
   outFile << left << nameAr[i]; 
   // << setw(25) << right << rEarnings << setw(25) << right << oEarnings << setw(25) << right << tEarnings << endl;
  }
 }

 outFile << endl << endl;

 outFile << setw(33) << trEarnings << " *" << setw(23) << toEarnings << " *" << setw(23) << ttEarnings << " *\n\n";

 outFile << left << "TOTAL EMPLOYEES" << " " << (i - 1);

 inFile.close(); outFile.close();

 return 0;
}

Я включил всю программу, чтобы дать вам представление о том, куда я планирую перейти с кодированием. Заранее спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 05 ноября 2010

fstream функция getline имеет эти подписи.

std::istream& getline (char* s, streamsize n );
std::istream& getline (char* s, streamsize n, char delim );

В вашем коде ...

string nameAr[EMP_NUM];
// stuff...
inFile.getline(nameAr[i], EMP_NUM, "*");

Вы пытаетесь использовать std::string, где getline хочет char* - вы не можете конвертировать из string в char*, как это.

Один из подходов состоит в том, что вы можете использовать буфер символов для хранения содержимого getline, например:

const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
inFile.getline(buffer, BUFFER_SIZE, '*');
// more stuff...

Лучшее решение

Я бы рекомендовал использовать std::getline из <string>, так как вы можете использовать string типы вместо C-строк.

#include <string>

// stuff...
std::getline(inFile, nameAr[i], '*');

редактировать ссылки для вас, так как вы изучаете

0 голосов
/ 05 ноября 2010

Похоже, у вас проблема с указателем.Вы пытаетесь сохранить указатель на массив символов в nameAr [], правильно?Что вам нужно сделать, это определить nameAr [] как массив указателей на массивы char, чтобы вы могли сохранить указатель на каждое имя в массиве nameAr [].

Попробуйте использовать это для массива имен вместоnameAr [].

nameAr = new char*[EMP_NUM];
...