0

我正在尝试用 C++ 编写一个程序,该程序将从文本文件中读取并写入文本文件。读取的文本文件的第一行将包含天数 (int),然后是三个销售人员的名字和姓氏在不同的行。然后它将有足够的数据行(双打)来为每个销售人员在给定的周数内提供每日销售额:示例文本文件如下所示:

2              // number of days, could change
sales person1 //first sales person's first and last name
sales person2
sales person3
11.45 30.23 34.56 37.84 45.96    //first day of sales for sales person1
20.45 33.0 22 11 26.87 90        //first day of sales for sales person2
33.57 40 20.87 23.9 45.8         //first day of sales for sales person3

56.6 75.8 39.0 23.3 10          //second day of sales for sales person1
40.34 54.2 12.4 43.5 23
23 45.6 75.34 27.45

我必须阅读三个销售人员的名字。但我不知道如何阅读每行中的双打,因为它们对应于每行中的不同销售人员。我只需要每行的总数。我应该如何处理这个?以下代码是我到目前为止所拥有的。请有人帮忙!

#include<iostream> 
#include<fstream>  
#include<cstdlib>
#include<string>
#include<cctype>
using namespace std;

void get_input(char input_file[]);
void get_output(char output_file[]);
void readFile(char name[]);
string getName(ifstream &in);
void writeFile(char output[]);

int main()
{
  ifstream in;
  char input_file[30];
  char output_file[30];   
  get_input(input_file);
  get_output(output_file);
  //int total = readFile(input_file);
  writeFile(output_file);  
}

void get_input(char input_file[])
{
   cout << "Enter name of the input file: ";
   cin >> input_file;
}

void get_output(char output_file[])
{
   cout << "Enter name of the output file: ";
   cin >> output_file;
}

void readFile(char fileName[])
{
  int weeks;  
  double total1 =0, sales1, total2 = 0, sales2, total3 = 0, sales3;

  ifstream in;  
  in.open(fileName);

  if(in.fail())
  {
    cout << " failed to open the input file" << endl;
     exit(-1);
  }

  in >> weeks; 
  cout << "Total weeks processed: " << weeks << endl;

  string name1 = getName(in);
  cout << name1 << endl;

  string name2 = getName(in);
    cout << name2 << endl;

  string name3 = getName(in);
    cout << name3 << endl;

  int i = 1;

  /*do         // this is where i want to process the sales and get the total
  {

    in >> sales1;
    total1 = total1 + sales1;

    in >> sales2;
    total2 = total2 + sales2;

    in >> sales3;
    total3 = total3 +sales3;

  } while(i <= 3);*/


  in.close();
}

string getName(ifstream &in)
{
   string first, last;   
   in >> first >> last;
   return first + " " + last;
}
void writeFile(char output[])
{
  ofstream out;
  out.open(output);
  out.close();
}
4

3 回答 3

2

您可以使用“getline”将一行读入字符串,然后将该字符串用作输入流。这是一个示例代码,读取 3 行双精度并打印每行的总和。

#include <iostream>
#include<string>
#include <fstream>
#include <sstream>
using namespace std;

int main() {
    ifstream fin("data.txt");
    string s;
    //read a line into 's' from 'fin' each time
    for(int i=0; i<3 && getline(fin,s); i++){
        //use the string 's' as input stream, the usage of 'sin' is just like 'cin'
           istringstream sin(s);
           double sum = 0.0, tmp;
           while(sin>>tmp){
               sum += tmp;
           }
           cout<<sum<<endl;
    }
    return 0;
}
于 2013-11-10T03:12:59.723 回答
0

您将希望将问题分解为更小的块。像这样瘦下来:

  1. 我如何得到人们的名字?(听起来你已经想通了)
  2. 我怎么知道每个人都用哪条线?(有一个简单的模式)
  3. 如何将文本行(字符串)转换为数值(双精度)
于 2013-11-10T02:18:41.217 回答
0

如果您将循环切换为这样的东西,您应该会很好。这是假设您想要每个人的总数。如果您希望每个人每周的总拆分数有所不同,则必须做一些不同的事情:

int totals[] = {0,0,0};
string line;

//for each week
for(int i = 0; i > weeks; i++)
{
   //for each person
   for(int j = 0; j >= 2; j++)
   {
      getline(in, line);
      totals[j] += getLineTotal(line);
   }

   //skip blank line. this will not be valid if the text file isn't formatted to have
   //lines that follow double, double, double, blank...
   getline(in, line);
}

...

double getLineTotal(string line)
{
   double sum, dubVal;

   sum = 0;
   while(line >> dubVal){
       sum += tmp;
   }
   return sum;
}
于 2013-11-10T03:33:17.890 回答