【问题标题】:Reading input from text file to array in c++ [duplicate]在c ++中将输入从文本文件读取到数组[重复]
【发布时间】:2011-05-05 18:29:20
【问题描述】:

好吧,请客气点,因为我是编程新手。到目前为止,我只学习过 C++,并且正在运行 Visual Studio 2010 作为我的编译器。对于这个程序,我试图从文本输入文件中读取信息并将信息写入一组三个数组。一个数组将处理姓名列表,另外两个数组分别用于工作时间和小时工资率。我将使用后两者来计算一组收入并将这些计算结果输出到另一个文本文件。然而,我的问题是获取第一个数组的输入。我正在使用的输入文件的文本排列如下:

J。美国能源部* 35 12.50

J。黎明* 20 10.00 .........

名称后面带有星号,因为我尝试使用 ifstream getline 来获取带有星号作为分隔符的名称,并将以下两个数字写入其他两个数组。后两个值由空格分隔,所以我认为它们不会引起任何问题。我确定还有其他错误需要处理,但我需要先解决第一个错误,然后才能开始调试其余错误。我在调用 inFile.getline 的行中遇到错误,内容如下:

错误 C2664: 'std::basic_istream<_elem> &std::basic_istream<_elem>::getline(_Elem *,std::streamsize,_Elem)' : 无法从 'std:: 转换参数 1 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;
}

我已经包含了整个程序,以便让您了解我打算在哪里进行编码。提前感谢您的帮助!

【问题讨论】:

标签: c++ arrays input fstream getline


【解决方案1】:

我不会以这种方式使用getline,因为您有两个单独的分隔符要处理 - 空格和星号。这就是我会做的事情:

使用getline 将整行放入名为linestring

使用line.find('*');查找星号

使用line.substr 将名称提取为新的string 直到刚刚找到的位置

将另一个substr 放在星号之外的stringstream 中,称为remainder

使用operator&gt;&gt;直接从中读取intdoubleremainder &gt;&gt; hours &gt;&gt; rate;

【讨论】:

    【解决方案2】:

    你好 C++ 新程序员!欢迎使用 C/C++ 进行编码。

    我知道你刚刚开始使用 C++。但是要解决您的问题,我们必须接触一点 C。C++ 恰好是 C 的超集。这意味着可以在 C 中完成的所有操作都可以在 C++ 程序中运行。

    足够的话,代码时间。将用于从输入文件中获取输入的代码替换为:

    char tmp[256];
    memset(tmp, '\0', sizeof tmp);
    inFile.getline(tmp, EMP_NUM, '*');
    nameAr[i] = tmp;
    inFile >> hoursAr[i] >> hrateAr[i];
    

    让我们来看看吧。

    char tmp[256]; 将创建一个临时数组用于读取值。此数组的大小可能会随您收到的名称的平均长度而变化。

    C 中的字符串就像是高维护的别致。您必须在末尾指定一个 NULL 字符 '\0' ,否则它们可能会使您的程序因不那么明显的分段错误而崩溃。然而,Memset 是一个在计算机地雷 中工作的小人。他会帮助我们解决这个问题。当以这种形式memset(tmp, '\0', sizeof tmp) 调用时,memset 从tmp 的地址开始,遍历数组的所有位-指定为sizeof tmp 的大小id-并将这些位设置为指定的字符-在本例中为NULL .这样我们就不必记住每次读取 C 字符串时都附加 NULL 字符;只要 tmp 的大小足够大。方便!

    inFile.getline(tmp, EMP_NUM, '*'); 按预期从您的文件中读取输入 [string] 并将其存储在 tmp 中。

    nameAr[i] = tmp; 将读取的输入放入 names 数组中。

    最后,inFile &gt;&gt; hoursAr[i] &gt;&gt; hrateAr[i]; 像以前一样读取小时数和小时费率。

    希望这会有所帮助。

    干杯! 快乐学习。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2023-03-30
      • 2020-06-14
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多