[英]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;
}
我已经包含了整个程序,以使您了解我打算在哪里进行编码。 先谢谢您的帮助!
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, "*");
您尝试在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.