c++ - Visual C++ - 读取文本文件,输出二维数组

标签 c++ visual-c++

当我从 main 调用 setArray 并从 setArray 调用 prinArray 时,期望一个 ']' 和表达式

不太确定这里出了什么问题。我必须读入 SaleSlip 值,然后找到每个销售人员每个 prodID 的总数。我这样做了,我知道这行得通。之后,我必须输出一个二维数组,其中包含每个销售人员对每个 prodID 的销售额,这有点困难。我还没有完成对 setArray 的所有调用,但您可以了解要点。

对当前的错误有什么帮助吗?

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

// Create structure SaleSlip for each sale per product per employee
struct SaleSlip{
    char name[20];
    int prodID;
    double value;
};
void setArray(string name, SaleSlip sales[]);
void printArray(string name, double product[][5], int j);

int main(){
    // Create stream for text file
    fstream slips;
    // Initialize sales with 17 different members
    SaleSlip sales[17];
    // Open .txt for information reading
    slips.open("SaleSlips.txt", ios::in);
    if(slips.eof()){
        cout << "Cannot open file(s) - SaleSlips.txt"<< endl;
        exit(1);
    }
    int i = 0;
    // Read and assign all names, product ids and prices to sales[]
    while(!slips.eof()){
        slips >> sales[i].name;
        slips.ignore(80, ' ');
        slips >> sales[i].prodID;
        slips.ignore(80, ' ');
        slips >> sales[i].value;
        slips.ignore(80, '\n');
        i++;
    }
    slips.close();
    // Format for output
    cout << "          Prod1     Prod2     Prod3     Prod4     Prod5" << endl;
    setArray("Bill", sales[]);
    cout << endl << endl;system("pause");
    return 0;
}

void setArray(string name, SaleSlip sales[]){

    int j;
    double product[4][5];
    const char * namechar = name.c_str ();
    if(strcmp (namechar, "Bill")) j = 0;
    if(strcmp (namechar, "Eric")) j = 1;
    if(strcmp (namechar, "Sookie")) j = 2;
    if(strcmp (namechar, "Tara")) j = 3;
    for(int i=0;i<17;i++){
        if(strcmp (sales[i].name, namechar) == 0)
            switch(sales[i].prodID){
                case 1: product[j][1] += sales[i].value; break;
                case 2: product[j][2] += sales[i].value; break; 
                case 3: product[j][3] += sales[i].value; break;
                case 4: product[j][4] += sales[i].value; break;
                case 5: product[j][5] += sales[i].value; break;
            }
    }
    printArray(name, product[][5], j);
}

void printArray(string name, double product[][5], int j){
    cout << name << ": ";
    for(int i=0; i<5;i++)
        cout << product[j][i] << "     ";
    cout << endl;
}

现在已格式化并正确输出:

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

// Create structure SaleSlip for each sale per product per employee
struct SaleSlip{
    char name[20];
    int prodID;
    double value;
};
void setArray(string name, SaleSlip sales[]);
void printArray(string name, double product[][5], int j);

int main(){
    // Create stream for text file
    fstream slips;
    // Initialize sales with 17 different members
    SaleSlip sales[17];
    // Open .txt for information reading
    slips.open("SaleSlips.txt", ios::in);
    if(slips.eof()){
        cout << "Cannot open file(s) - SaleSlips.txt"<< endl;
        exit(1);
    }
    int i = 0;
    // Read and assign all names, product ids and prices to sales[]
    while(!slips.eof()){
        slips >> sales[i].name;
        slips.ignore(80, ' ');
        slips >> sales[i].prodID;
        slips.ignore(80, ' ');
        slips >> sales[i].value;
        slips.ignore(80, '\n');
        i++;
    }
    slips.close();
    // Format for output
    cout << "          Prod1     Prod2     Prod3     Prod4     Prod5" << endl;
    setArray("Bill", sales);
    setArray("Eric", sales);
    setArray("Sookie", sales);
    setArray("Tara", sales);

    cout << endl << endl;system("pause");
    return 0;
}

void setArray(string name, SaleSlip sales[]){
    int j = -1;
    double product[4][5] = {0};
    const char * namechar = name.c_str ();
    if(strcmp (namechar, "Bill") == 0) j = 0;
    if(strcmp (namechar, "Eric") == 0) j = 1;
    if(strcmp (namechar, "Sookie") == 0) j = 2;
    if(strcmp (namechar, "Tara") == 0) j = 3;
    for(int i=0;i<17;i++){
        if(strcmp (sales[i].name, namechar) == 0)
            switch(sales[i].prodID){
                case 1: product[j][0] += sales[i].value;break;
                case 2: product[j][1] += sales[i].value;break; 
                case 3: product[j][2] += sales[i].value;break;
                case 4: product[j][3] += sales[i].value;break;
                case 5: product[j][4] += sales[i].value;break;
                default: cout << "Safety.";
            }
    }
    printArray(name, product, j);
}

void printArray(string name, double product[][5], int j){
    cout << setiosflags(ios::left | ios::fixed) << setprecision(2);
    cout << setw(10) << name + ":";
    for(int i=0; i<5;i++)
        if(product[j][i] != 0)
            cout << setw(10) << product[j][i];
        else cout << setw(10) << 0;
    cout << endl;
}

最佳答案

  1. 你应该检查是否strcmp如果字符串相等则返回 0:

    if (strcmp(namechar, "Bill") == 0);
    
  2. []将数组作为参数传递时不需要,仅当您创建一个时才需要:

    setArray("Bill", sales);
    // ...
    printArray(name, product, j);
    
  3. for 循环的第一次迭代会在您的程序中导致未定义的行为,因为 product数组未初始化。使用 std::vector相反。

您可能应该使用 std::map<std::string, double>而不是 double 组

关于c++ - Visual C++ - 读取文本文件,输出二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17893074/

相关文章:

c++ - 为什么调用直接父类的函数而不是祖父类的函数。这称为函数覆盖吗?

c# - 从 C++ 库方法返回的 "char*"获取 C# 字符串?

c++ - 为什么boost asio中的async_read将const MutableBufferSequence作为第二个参数?

c++ - 如何使用设备 ID 获取 USB 硬件 ID?

c++ - Visual C++ 2010 错误。运行 LibICP 时系统找不到指定的文件

c++ - 将 "getline"与数组一起使用

c++ - Release模式错误但构建模式不错误

c++ - 试图计算我的 "sir"(字符串)类的 ASCII 码总和

c# - 获取指向 C# 的 C++ 指针

c++ - 类的成员应该是指针吗?