C++ 不正确的循环算法(或文件处理问题)
C++ Incorrect Looping Algorithm (or file processing issue)
我正在尝试编写一个程序来读取文本文件、做一些数学运算、显示答案,然后写入文本文件。该程序目前只写了一行文本,而不是我想要的 5 行。
输入的文本文件格式如下:
string double double
string double double
string double double
string double double
string double double
输出文本文件变成这样:
字符串,双精度,双精度,双精度,
它写了我想要的,但只写了一次。
我希望它处理所有 5 行。我的程序只处理输入文本文件的最后一行。
这是输入文本文件的样子(只是没有文件名)
//payinfile.txt
2198514 17.20 11.25
6698252 59.25 21.00
5896541 50.00 10.00
8863214 45.00 18.20
8465555 25.75 14.80
这是我的程序的代码
// outputprogram.cpp
#include <iostream>
#include <fstream> // file stream
#include <iomanip>
#include <string>
#include <cstdlib> // exit function prototype
using namespace std;
void outputLine(const string, double, double); // prototype
// void writeToFile();
int main()
{
// ifstream constructor opens the file
ifstream inputFile("payinfile.txt", ios::in);
// exit program if ifstream could not open file
if (!inputFile)
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
} // end if
string ID; // the account number
double hours; // the account owner's name
double rate; // the account balance
cout << left << setw(10) << "ID" << setw(15)
<< "Hours" << setw(10) << "Rate" << right << setw(10) << "Gross" << endl << fixed << showpoint;
// display each record in file
while (inputFile >> ID >> hours >> rate)
{
outputLine(ID, hours, rate);
}
} // end main
// display single record from file
void outputLine(const string ID, double hours, double rate)
{
double gross;
gross = 0.0;
gross = (hours * rate);
cout << left << setw(10) << ID
<< setw(15) << hours
<< setw(15) << setprecision(2) << rate
<< setw(10) << setprecision(2) << gross << endl;
// ofstream constructor opens file
ofstream writeToFile("FinalOutput.txt", ios::out);
// exit program if unable to create file
if (!writeToFile) // overloaded ! operator
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
} // end if
writeToFile << ID << ", " << hours << ", " << rate << ", " << gross << ", ";
} // end function outputLine
执行后输出文件如下所示:
//FinalOutput.txt
8465555, 25.75, 14.8, 381.1,
所以它写了我想要的,我也只是希望它也将其他 4 行写到 FinalOutput.txt
这一行:
ofstream writeToFile("FinalOutput.txt", ios::out);
您每次要写一行时都在打开输出文件。这将截断文件(即删除内容)。
您可以每次都以追加模式打开文件,或者更好的是,在函数外部打开文件一次,然后通过引用将流对象传递给 outputLine
函数。
我正在尝试编写一个程序来读取文本文件、做一些数学运算、显示答案,然后写入文本文件。该程序目前只写了一行文本,而不是我想要的 5 行。
输入的文本文件格式如下:
string double double
string double double
string double double
string double double
string double double
输出文本文件变成这样: 字符串,双精度,双精度,双精度,
它写了我想要的,但只写了一次。 我希望它处理所有 5 行。我的程序只处理输入文本文件的最后一行。
这是输入文本文件的样子(只是没有文件名)
//payinfile.txt
2198514 17.20 11.25
6698252 59.25 21.00
5896541 50.00 10.00
8863214 45.00 18.20
8465555 25.75 14.80
这是我的程序的代码
// outputprogram.cpp
#include <iostream>
#include <fstream> // file stream
#include <iomanip>
#include <string>
#include <cstdlib> // exit function prototype
using namespace std;
void outputLine(const string, double, double); // prototype
// void writeToFile();
int main()
{
// ifstream constructor opens the file
ifstream inputFile("payinfile.txt", ios::in);
// exit program if ifstream could not open file
if (!inputFile)
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
} // end if
string ID; // the account number
double hours; // the account owner's name
double rate; // the account balance
cout << left << setw(10) << "ID" << setw(15)
<< "Hours" << setw(10) << "Rate" << right << setw(10) << "Gross" << endl << fixed << showpoint;
// display each record in file
while (inputFile >> ID >> hours >> rate)
{
outputLine(ID, hours, rate);
}
} // end main
// display single record from file
void outputLine(const string ID, double hours, double rate)
{
double gross;
gross = 0.0;
gross = (hours * rate);
cout << left << setw(10) << ID
<< setw(15) << hours
<< setw(15) << setprecision(2) << rate
<< setw(10) << setprecision(2) << gross << endl;
// ofstream constructor opens file
ofstream writeToFile("FinalOutput.txt", ios::out);
// exit program if unable to create file
if (!writeToFile) // overloaded ! operator
{
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
} // end if
writeToFile << ID << ", " << hours << ", " << rate << ", " << gross << ", ";
} // end function outputLine
执行后输出文件如下所示:
//FinalOutput.txt
8465555, 25.75, 14.8, 381.1,
所以它写了我想要的,我也只是希望它也将其他 4 行写到 FinalOutput.txt
这一行:
ofstream writeToFile("FinalOutput.txt", ios::out);
您每次要写一行时都在打开输出文件。这将截断文件(即删除内容)。
您可以每次都以追加模式打开文件,或者更好的是,在函数外部打开文件一次,然后通过引用将流对象传递给 outputLine
函数。