-1

私はプログラミングの初心者なので、優しくしてください。これまでのところ、私は C++ しか勉強しておらず、コンパイラとして Visual Studio 2010 を実行しています。このプログラムでは、テキスト入力ファイルから読み取り、情報を 3 つの配列のセットに書き込もうとしています。1 つの配列は名前のリストを処理し、残りの 2 つはそれぞれ勤務時間と時給です。後者の 2 つを使用して一連の収益を計算し、全体をレポートとして別のテキスト ファイルに出力します。ただし、私の問題は、最初の配列の入力を取得することです。私が使用している入力ファイルには、次のように配置されたテキストがあります。

J. Doe* 35 12.50 J. Dawn* 20 10.00 ..........

ifstream getline を使用して区切り記号として機能するアスタリスクを使用して名前を取得し、次の 2 つの数値を他の 2 つの配列に書き込もうとしているため、名前の後にアスタリスクが付きます。後者の 2 つの値は空白で区切られているため、問題は発生しないと思います。処理が必要なエラーが他にもあると確信していますが、残りのデバッグを開始する前に、最初のエラーを処理する必要があります。

エラー 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;
}

プログラム全体を含めて、コーディングのどこに行く予定かを理解してもらいます。助けてくれてありがとう!

4

2 に答える 2

5

fstreamgetline関数にはこれらのシグネチャがあります。

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::stringwhere getlinewant aを使用しようとしています - このように からにchar*変換することはできません。stringchar*

1 つのアプローチは、このように、文字バッファーを使用して の内容を格納することgetlineです。

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

より良い解決策

C文字列の代わりに型を使用できるため、std::getlinefromを使用することをお勧めします。<string>string

#include <string>

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

あなたが学んでいるので、あなたのためにリンクを編集してください

于 2010-11-05T18:24:01.283 に答える
0

ポインタに問題があるようです。nameAr[] に char 配列へのポインタを格納しようとしていますね。nameAr[] 配列に各名前へのポインターを格納できるように、nameAr[] を char 配列へのポインターの配列として定義する必要があります。

nameAr[] の代わりにこれを名前配列に使用してみてください。

nameAr = new char*[EMP_NUM];
于 2010-11-05T18:22:28.667 に答える