Что делает код:
Приведенный ниже код должен форматировать файлы .cpp для принтера, ограничивая количество символов в каждой строке кода без потери кода. Код должен проходить через файл char за char. Это делается путем открытия ifstream
и последующего использования метода get
для получения каждого символа до тех пор, пока не будет найден EOF
. Когда каждый символ захвачен, он увеличивается до std::string
(vector
), так как каждый символ выдвигается, счетчик линейных символов увеличивается. Если новый символ строки найден до того, как счетчик символов строки превысит его максимальный размер, он сбрасывается и продолжается на следующей строке. Если число символов строки на 2 меньше, чем максимальное число символов до того, как будет найден символ '\n'
, \
, \n
, ' '
(x tab count) добавляются в конец string
быть написанным Затем остальная часть строки добавляется к string
. Хотя, если последний символ, добавленный к string
, не является символом ' '
, то у string
все символы между его концом и ближайшим к левому символу ' '
будут удалены и помещены в начало нового линия, после 5 ' '
символов на новой строке. Последний бит, где я думаю, что ошибка.
Пример строки: (притворяется больше, чем максимальное количество символов)
LongLong123 longLineOfCode;\n;
Пример вывода:
Bad:
LongLong123 longLineOfCo\\n
de;\n
Хорошо:
LongLong123\\n
longLineOfCode;\n
Ошибка:
Необработанное исключение в 0x55CC1949 (ucrtbased.dll) в SubmitFormater.exe: 0xC00000FD: переполнение стека (параметры:
0x00000000, 0x00F02000). произошло
Пример командной строки:
110 5 "C:/Users/holycatcrusher/Documents/OC 2018 Fall/222/Labs/COSC_222_Data_Structures_Cpp/SubmitFormater.cpp"
110 - это число символов в строке, 5 - количество символов на вкладке (5 пробелов), а длинная строка - адрес файла, который нужно отформатировать (сделать копию файла, так как в случае ошибки введенный файл будет уничтожен). Я использую код, который составляет этот проект в качестве примера ввода (его копию).
код:
/* SubmitFormater.cpp
This file was created by Bradley Honeyman
Oct 25, 2018
This file is used to format submit files for COSC 222 asignments
*/
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
#include <stdbool.h>
#include <stddef.h>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
std::string *processFile(std::ifstream *input, int maxCharCount, int tabSpaceSize, char delimiter, std::string *code, int lineCharCount);
int toInt(char *input);
int main(int argc, char **argv) {
std::cout << "Running 222 formatter" << std::endl << "by: Bradley Honeyman" << std::endl;
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//make sure there is the min number of commands
if (argc < 3) {
std::cout << "Ensure there is a specified max line length and at least one file to modify!" << std::endl;
return 0;
}
for (int i = 3; i < argc; i++) {
//open file and make sure it opens
std::ifstream input;
input.open(argv[i]);
if (!input.is_open()) {
std::cout << "Could not open the input file: " << argv[i] << std::endl;
return EXIT_FAILURE;
}
//process code
std::string *code = new std::string();
processFile(&input, toInt(argv[1]), toInt(argv[2]), ' ', code, 0);
//check for error
if (code == NULL) {
return EXIT_FAILURE;
}
//output
input.close();
std::ofstream out(argv[i]);
if (!out.is_open()) {
std::cout << "could not write to output file" << std::endl;
return EXIT_FAILURE;
}
//print to file
std::cout << code->c_str() << std::endl;
out << code->c_str();
//close out delete code pointer
out.close();
delete code;
}
return 0;
}
/*
formats a file by placing \\\n the custom tab whereever the length of a line is bigger than the max
also a delimiter is used, so words aren't cut in half
*/
#define FORMAT_CHAR_COUNT 2
std::string *processFile(std::ifstream *input, int maxCharCount, int tabSpaceSize, char delimiter, std::string *code, int lineCharCount) {
//std::cout << "Processing" << std::endl;
//get char and check if is end of file
char current = input->get();
//std::cout << "\'" << current << "\'" << std::endl;
if (input->eof()) {
return code;
}
//incerment char count then check if are at furthest possible position
lineCharCount++;
//std::cout << lineCharCount << std::endl;
if (current == '\n') {
lineCharCount = 0;
//check if are at max char count, split code and put to new line
} else if (lineCharCount >= maxCharCount && current != '\\') {
//if not at the end of the line go back to the closest delimiter to break
std::string *pre = new std::string("");
bool fail = false;
if (current != '\n' && code->at(code->size() - 1)) {
code->push_back(current);
int i = code->size() - 1;
int back = 0;
for (i; i >= 0; i--) {
pre->push_back(code->at(i));
back++;
if (back > maxCharCount - tabSpaceSize - FORMAT_CHAR_COUNT) {
std::cout << "Can not format file because there isn't a place close enough to break at a delimiter!" << std::endl;
fail = true;
break;
}
}
//check for fail
if (!fail) {
//add delimiter if it needs to be
if (pre->size() > 0 && pre->at(pre->size() - 1) != delimiter) {
pre->push_back(delimiter);
}
//reverse prepending string, and remove code that is to be prepended
std::reverse(pre->begin(), pre->end());
code->assign(code->substr(0, code->size() - back - 1));
}
}
//insert \ then new line then tab then set char count to tab size + pre size + 1 for char to be added
code->push_back('\\');
code->push_back('\n');
for (int i = 0; i < tabSpaceSize; i++) { code->push_back(' '); } //create tab
code->append(pre->c_str());
lineCharCount = tabSpaceSize + 1 + pre->size();
pre->clear();
delete pre;
}
//add char to code and run again
code->push_back(current);
return processFile(input, maxCharCount, tabSpaceSize, delimiter, code, lineCharCount);
}
/*
converts string to an int
*/
int toInt(char *input) {
int i = 0;
int out = 0;
while (input[i] != '\0') {
out = (out * 10) + (input[i] - '0');
i++;
}
return out;
}
Кроме того, вы можете использовать приведенный выше код в качестве примера файла .cpp. Не забудьте использовать копию, хотя, потому что программа изменит файл!
Call Stack Часть 1 и 2 (щелкните изображения, чтобы иметь возможность их прочитать)
Примечание:
Причина проблемы раскрывается в разговоре.