В практических целях я попытался создать консольное приложение, которое будет хранить основную информацию о сотрудниках и сохранять ее в текстовом файле 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