簡體   English   中英

在C ++中將輸入從文本文件讀取到數組

[英]Reading input from text file to array in c++

好吧,請保持謙虛,因為我是編程的新手。 到目前為止,我僅研究過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;
}

我已經包含了整個程序,以使您了解我打算在哪里進行編碼。 先謝謝您的幫助!

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, "*");

您嘗試在getline需要char*地方使用std::string您不能像這樣從string轉換為char*

一種方法是您可以使用字符緩沖區來存儲getline的內容,就像這樣。

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

更好的解決方案

我建議使用<string> std::getline ,因為您可以使用string類型而不是C字符串。

#include <string>

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

編輯鏈接你,因為你正在學習

看來您有指針問題。 您正在嘗試將指向char數組的指針存儲在nameAr []中,對嗎? 您需要做的是將nameAr []定義為指向char數組的指針的數組,以便可以將指向每個名稱的指針存儲在nameAr []數組中。

嘗試使用此名稱數組而不是nameAr []。

nameAr = new char*[EMP_NUM];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM