代码的作用
下面的代码应该通过限制每行代码中的字符数而不丢失任何代码来格式化打印机的.cpp文件。该代码应该逐个通过char文件。通过打开while some_variable='whatever_you_want':
,然后使用ifstream
方法来获取每个字符,直到找到get
为止。抓取每个字符时,将其推入EOF
(std::string
)时,行字符计数增加。如果在行字符计数大于最大大小之前找到了新的行字符,它将被重置并在下一行继续。如果在找到vector
字符之前,行字符数比最大字符数少2,则附加'\n'
,\
,\n
的{x制表符数}到要写入的' '
的末尾。然后,该行的其余部分将附加到string
。但是,如果添加到string
的最后一个字符不是string
字符,则' '
会删除其末尾和最接近左侧string
字符之间的所有字符并放置在新行的开头,在新行的5个' '
字符之后。最后一点是我认为错误所在的位置。
示例行 :(假装大于最大字符数)
' '
示例输出:
坏:
LongLong123 longLineOfCode;\n;
好:
LongLong123 longLineOfCo\\n
de;\n
错误:
SubmitFormater.exe中0x55CC1949(ucrtbased.dll)的未处理异常:0xC00000FD:堆栈溢出(参数: 0x00000000、0x00F02000)。发生
示例命令行:
LongLong123\\n
longLineOfCode;\n
110是一行中的字符数,5是制表符的字符数(5个空格),长字符串是要格式化的文件的地址(进行复制)错误的文件将被销毁)。我正在使用构成该项目的代码作为示例输入(它的副本)。
代码:
110 5 "C:/Users/holycatcrusher/Documents/OC 2018 Fall/222/Labs/COSC_222_Data_Structures_Cpp/SubmitFormater.cpp"
另外,您可以将上面的代码用作示例.cpp文件。不过请记住要使用副本,因为程序会修改文件!
调用堆栈的第1部分和第2部分(点击图片即可阅读它们)
注意:
对话中涵盖了问题的原因。
答案 0 :(得分:0)
在这篇文章中进行了很多讨论之后,我认为值得发表最终成为我解决方案的东西。还有一些关于我得出的结论的注释。
代码:
/* 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
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) {
//get char and check if is end of file
char current = input->get();
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 delimiter push everything to the right of the nearest delimiter to the left to pre
int back = 0;
std::string pre("");
if (current != delimiter) {
for (int i = code->size() - 1; i >= 0; i--) {
back++;
if (code->at(i) == delimiter) {
pre.push_back(code->at(i));
break;
} else {
pre.push_back(code->at(i));
}
}
//remove what was added to pre from code
std::reverse(pre.begin(), pre.end());
code->assign(code->substr(0, code->size() - back));
}
//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);
lineCharCount = tabSpaceSize + 1 + pre.size();
}
//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;
}
注释: