2013-11-10 182 views
0

我正在尝试使用C++编写一个程序,该程序将从文本文件中读取并写入文本文件。读取的文本文件将在第一行中包含天数(int),然后是三个销售人员在不同行上的姓和名。然后,它会具有的数据(双打)足够的线路来为每个销售人员一周的给定数字每天销售:C++从文本文件读取双行

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(); 
} 
+1

你不是递增'i'。 – 0x499602D2

回答

0

您会希望将问题分解为更小的块。薄如下:

  1. 我如何得到人的名字? (听起来像你已经知道了这一点)
  2. 我怎么知道哪一行与每个人? (有一个简单的模式)
  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; 
} 
+0

我做到了这一点:但它以某种方式打印0作为第一个总字符串s;对于(int j = 0; j <= 3 && getline(in,s); j ++) { getline(in,s);对于(int i = 1; i <周; i ++) { istringstream sin(s); while(cin >> sales) { total + = sales; } cout << total << endl; } }'我在循环之前将总数和销售额初始化为零 – pdhimal1

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; 
}