Стек C6262 превышает предупреждение в C ++ при использовании ofstream в файле - PullRequest
0 голосов
/ 05 мая 2019

В практических целях я попытался создать консольное приложение, которое будет хранить основную информацию о сотрудниках и сохранять ее в текстовом файле employee-info.txt.Мне удалось записать данные в текстовый файл, но каждый раз, когда программа записывает новые данные, появляется предупреждение C6262.Предупреждение можно увидеть в функции employeeDataChecker () и employeeWriteData () в Employee.cpp, в которой я укажу коды ниже.

Для employeeDataChecker () в предупреждении указывается, что функция использует «22800» байтов стека: превышает / анализирует: размер стека 16384 ».Попробуйте переместить некоторые данные в кучу.Для employeeWriteData оно имеет то же предупреждение, но больше байтов стека '23264'.Я даже пытался добавить указатели в массивы, которые я интегрировал в код, но это еще больше испортило мой код.

Добрые советы и некоторые рекомендации о том, как управлять этим или дать мне лучшее решение для достижения моей цели,Вы также можете указать на плохие практики, которые я сделал, чтобы я мог учиться на этом, чтобы улучшить свой код.Код, который я предоставил ниже, длинный, но я все еще работаю над ним каждый день, чтобы минимизировать код.

В настоящее время это данные, хранящиеся в employee-info.txt:

       ID           Firstname            Lastname                 Sales
        1              Dwyane             Anthony             250000.00
        2              Joseph            Cardinal             450000.00
        4               Bruno                Mars             250000.00

Это код для Employee.h:

#pragma once
#include<string>
#include<iostream>

class Employee
{
public:
struct EmployeeRecord {
    static const int recordSize = 100;
    static const int fieldSize = 4;
    std::string record[recordSize][fieldSize];
};

public:
Employee();
~Employee();
void employeeDataChecker();
void employeeWriteData(int recordCount, std::string recordCopy[EmployeeRecord::recordSize][EmployeeRecord::fieldSize]);
void employeeDisplayData();
EmployeeRecord& employeeReturnRecordArray();

private:
EmployeeRecord emp_record;

};

А вот код в Employee.cpp:

void Employee::employeeDataChecker() {
//Check if there are data in the employee-info.txt
EmployeeRecord emp;
std::ifstream inFile, inFile2;
int recordCount = 0;
inFile.open("C:\\Users\\RJ\\Desktop\\employee-info.txt"); // use to get the number of values stored in record array
inFile2.open("C:\\Users\\RJ\\Desktop\\employee-info.txt"); // use to get all contents in record array

for (int index = 0; index < emp.recordSize; index++) {
    for (int index2 = 0; index2 < emp.fieldSize; index2++) {
        while (inFile >> emp.record[index][index2]) {
            recordCount++;
        }
    }
}

for (int index = 0; index < emp.recordSize; index++) {
    for (int index2 = 0; index2 < emp.fieldSize; index2++) {
        inFile2 >> emp.record[index][index2];
    }
}
//used as a dummy array to hold the values in record array and pass as an argument 
std::string recordCopy[emp.recordSize][emp.fieldSize];


    for (int index = 0; index < emp.recordSize; index++) {
        for (int index2 = 0; index2 < emp.fieldSize; index2++) {
            recordCopy[index][index2] = emp.record[index][index2];
        }
    }



inFile.close();
inFile2.close();

employeeWriteData(recordCount, recordCopy);
}//end of employeeDataChecker

void Employee::employeeWriteData(int recordCount, std::string recordCopy[EmployeeRecord::recordSize][EmployeeRecord::fieldSize]) {
Employee emp;
EmployeeRecord empRec;
int numEmployees;
std::string firstName, lastName;
std::string fullName = "";
double sales;

std::ofstream outFile;
outFile.open("C:\\Users\\RJ\\Desktop\\employee-info.txt", std::ofstream::app);

//pass all values from recordCopy to record array
for (int index = 0; index < empRec.recordSize; index++) {
    for (int index2 = 0; index2 < empRec.fieldSize; index2++) {
        empRec.record[index][index2] = recordCopy[index][index2];
    }
}

std::cout << "------------------------------------------------" << std::endl;
std::cout << "Enter The Number of Employees to Add: ";
std::cin >> numEmployees;
std::cin.get();

if (recordCount == 0) {

    //If employee-info.txt is empty.
    outFile << std::fixed << std::showpoint << std::setprecision(2);
    outFile << std::setw(5) << "ID";
    outFile << std::setw(20) << "Firstname";
    outFile << std::setw(20) << "Lastname";
    outFile << std::setw(22) << "Sales" << std::endl;

    for (int index = 0; index < numEmployees; index++) {
        int empID = index;
        empID++;
        std::cout << "*****Employee ID No." << empID << "*****" << std::endl;
        std::cout << "Enter First Name: ";
        std::getline(std::cin, firstName);
        std::cout << "Enter Last Name: ";
        std::getline(std::cin, lastName);
        fullName = firstName + " " + lastName;

        std::cout << "Enter Total Sales: ";
        std::cin >> sales;

        std::string empIDConverted = std::to_string(empID);
        std::string salesConverted = std::to_string(sales);

        for (int index2 = 0; index2 < empRec.fieldSize; index2++) {
            if (index2 == 0) {
                empRec.record[index][index2] = empIDConverted;
            }
            else if (index2 == 1) {
                empRec.record[index][index2] = firstName;
            }
            else if (index2 == 2) {
                empRec.record[index][index2] = lastName;
            }
            else if (index2 == 3) {
                empRec.record[index][index2] = salesConverted;
            }
        }

        outFile << std::fixed << std::showpoint << std::setprecision(2);
        int numSetW;
        for (int index2 = 0; index2 < empRec.fieldSize; index2++) {

            if (index2 == 0) {
                numSetW = 5;
            }
            else if(index2 == 3){
                numSetW = 22;
            }
            else {
                numSetW = 20;
            }

            if (index2 == (empRec.fieldSize - 1)) {

                std::string getSales = empRec.record[index][index2];
                double salesPreviousType;
                std::istringstream iss(getSales);
                iss >> salesPreviousType;

                outFile << std::setw(numSetW) << salesPreviousType << std::endl;
            }
            else {
                outFile << std::setw(numSetW) << empRec.record[index][index2];
            }
        }
        std::cin.get();
    }

}
else if (recordCount >= empRec.fieldSize) {
    //If employee-info.txt already has an existing data. It will write new data at the end of record array.

    int rows = recordCount / empRec.fieldSize;
    int increasedFieldSize = empRec.fieldSize * 2;
    int preIndex = rows;

    for (int index = rows; index < (numEmployees + preIndex); index++) {
        int empID = index;
        empID++;
        std::cout << "*****Employee ID No." << empID << "*****" << std::endl;
        std::cout << "Enter First Name: ";
        std::getline(std::cin, firstName);
        std::cout << "Enter Last Name: ";
        std::getline(std::cin, lastName);
        fullName = firstName + " " + lastName;

        std::cout << "Enter Total Sales: ";
        std::cin >> sales;

        std::string empIDConverted = std::to_string(empID);
        std::string salesConverted = std::to_string(sales);

        for (int index2 = 0; index2 < empRec.fieldSize; index2++) {
            if (index2 == 0) {
                empRec.record[index][index2] = empIDConverted;
            }
            else if (index2 == 1) {
                empRec.record[index][index2] = firstName;
            }
            else if (index2 == 2) {
                empRec.record[index][index2] = lastName;
            }
            else if (index2 == 3) {
                empRec.record[index][index2] = salesConverted;
            }
        }

        outFile << std::fixed << std::showpoint << std::setprecision(2);
        int numSetW;
        for (int index2 = 0; index2 < empRec.fieldSize; index2++) {

            if (index2 == 0) {
                numSetW = 5;
            }
            else if (index2 == 3) {
                numSetW = 22;
            }
            else {
                numSetW = 20;
            }

            if (index2 == (empRec.fieldSize - 1)) {

                std::string getSales = empRec.record[index][index2];
                double salesPreviousType;
                std::istringstream iss(getSales);
                iss >> salesPreviousType;

                outFile << std::setw(numSetW) << salesPreviousType << std::endl;
            }
            else {
                outFile << std::setw(numSetW) << empRec.record[index][index2];
            }

        }
        std::cin.get();
    }

}
else {
    std::cout << "Number problem!";
}


outFile.close();
  }//end of employeeWriteData

1 Ответ

1 голос
/ 05 мая 2019

Ваша структура EmployeeRecord достаточно велика для размещения в стеке из-за статического массива 100x4 std::string. Выделите массив или экземпляр EmployeeRecord динамически, чтобы устранить это предупреждение.

То же самое для std::string recordCopy[emp.recordSize][emp.fieldSize];.

...