用c++一次一个地处理每个文本文件中的值

Processing values in each text file one at a time c++

本文关键字:文本 文件 一个 c++ 一次 处理      更新时间:2023-10-16

我正在尝试处理两个文本文件中的值。其中一个包含一组字符,另一个则包含一组整数。每个字符在文本文件中各自的位置将相当于一个测试用例。例如,在每个文本文件中读取的第一个值是1个测试用例。然后用这些值来检查可变性,然后在我的代码中用它作为变量。最后打印出一个double。问题是我不知道如何达到测试用例的第二次迭代。我的代码所做的只是读取每个文本文件的第一个值,并打印出我需要的双精度,但仅用于第一个测试用例。当我输入这个时,我想也许在使用完值后删除它们,然后让我的main在for循环中重新运行程序?建议?

#include <iostream>
#include <fstream>
using namespace std;
//function prototypes
char getPackage();
bool vaildPackage(char);
int getHours();
bool validHours(int);
double calculatePakg_A(int);
double calculatePakg_B(int);
double calculatePakg_C(int);
void showBill(double);
int main()
{
    char Package = getPackage();
    int Hours = getHours();
    double bill;
    switch (Package)
        {
    case 'A':bill = calculatePakg_A(Hours);
        cout << bill << endl;
        break;
    case 'B':bill =  calculatePakg_B(Hours);
        cout << bill << endl;
        break;
    case 'C':bill = calculatePakg_C(Hours);
        cout << bill << endl;
        break;
    case 'a':bill = calculatePakg_A(Hours);
        cout << bill << endl;
        break;
    case 'b':bill = calculatePakg_B(Hours);
        cout << bill << endl;
        break;
    case 'c':bill = calculatePakg_C(Hours);
        cout << bill << endl;
        break;
    default: cout << "you did not enter a valid Service Plan. n";
        break;
        }
    return 0;
}
char getPackage()
{
    ifstream inputFile;
    char a;
    inputFile.open("Packages.txt");
  do
  {
    inputFile >> a;
  } while (! vaildPackage(a));
  return a;
}
 bool vaildPackage(char a)
{
    return a == 'a' || a == 'A'|| a == 'B' || a == 'b'|| a == 'C' || a ==      'c';
}
int getHours()
{
    ifstream inFile;
    int n;
    inFile.open("Hours.txt");
do
{
  inFile >> n;
} while (! validHours(n));
return n;
}
bool validHours(int n)
{
    return n>=0 && n<= 720;
}
double calculatePakg_A(int hrs)
{
    if(hrs <=50)
   {
       return 15.00;
   }
   else
   {
       return (hrs-50) * 2.00 + 15;
   }
}
double calculatePakg_B(int hrs)
{
    if(hrs <=100)
    {
        return 20.00;
    }
    else
    {
        return (hrs-100) * 1.50 + 20.00;
    }
}
double calculatePakg_C(int hrs)
{
    if(hrs <=150)
    {
       return 25.00;
    }
    else
    {
       return (hrs-150) * 1.00 + 25.00;
    }
}

Package.txt

A A B C e C

Hours.txt

50 51 100 101 149 251 750 722

我相信你知道,你可以从一个流中读取多个字段:

ifstream inputFile;
char a;
inputFile.open("Packages.txt");
inputFile >> a;
cout << a << endl;
inputFile >> a;
cout << a << endl;

代码不起作用的原因是,当控件从getPackage()返回时,变量inputFile将被删除,因此每次调用该函数时,它都会重新打开文件并从头开始读取。

一种解决方案是使输入流成为静态变量,这样它就不会被删除,而是会从一个调用到下一个调用保持其状态:

char getPackage()
{
  static ifstream inputFile("Packages.txt");
  char a;
  inputFile >> a;
  return a;
}

我认为这里唯一的问题是这个。

在函数getPackage()

inputFile.open("Packages.txt");

每次调用此函数时,都会打开文件

因此,此函数每次读取第一个条目(仅)。

getHours函数也有同样的问题。

一种方法是,您可以将文件中的所有条目一次性读取到数据结构中,比如vector,然后在主函数中迭代该vector。

另一种方法是在main函数中打开文件,并在main中引入一个调用这些函数的循环。每次调用它们时,它们都会返回文件中的下一个条目。这需要将打开的文件ifstream &作为参数传递给函数getHoursgetPackage