首页 文章

在c [duplicate]中将文本文件中的输入读取到数组

提问于
浏览
0

这个问题在这里已有答案:

好吧,温柔,因为我非常喜欢编程 . 到目前为止,我只学习了C,我正在运行Visual Studio 2010作为我的编译器 . 对于这个程序,我试图从文本输入文件中读取并将信息写入一组三个数组 . 一个阵列将处理名称列表,另外两个分别用于工作小时数和小时工资率 . 我将使用后两者计算一组收入并将这些计算输出到另一个文本文件 . 然而,我的问题是获取第一个数组的输入 . 我正在使用的输入文件的文本排列如下:

J. Doe * 35 12.50

J. Dawn * 20 10.00 .........

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

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

  • 1

    你好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 >> hoursAr[i] >> hrateAr[i]; 像以前一样读取小时和小时费率 .

    希望这可以帮助 .

    干杯!快乐学习 .

  • 1

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

    使用 getline 将FULL行放入名为 linestring 中 .

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

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

    将星号之外的另一个 substr 带入名为 remainderstringstream .

    使用 operator>> 直接读取 intdoubleremainder >> hours >> rate;

相关问题