【发布时间】:2015-10-23 03:01:09
【问题描述】:
我正在制作一个程序,它会用我的名字、日期、文件名和它的功能描述来添加注释。它还查找任何添加了每个函数作用描述的int 和void 函数。
我已经完成了这些步骤!
我创建了一个vector<string>,它将整个文件读入自身。然后它搜索向量内的任何void 或int 函数。如果找到int,它会调用string findParameters 来查找int 的参数并在描述中列出它们。
示例:
/*THE DESCRIPTION THAT THE PROGRAM MADE IS BELLOW*/
/*Function: int nDigits
Description:
Description of the function
Parameters:
long long number: Description
Returns:
returnVal: Description
*/
/*THE FUNCTION THE PROGRAM WAS LOOKING FOR IS BELLOW*/
int nDigits(long long number){
int counter;
for (counter = 0; number > 0; counter++){
number = number / 10;
}
return counter;
}
问题
该程序在不超过 160 行时运行良好,但是当我输出时以及当我尝试在记事本中打开它时,它上面的任何内容都会将所有内容转换为十六进制,除了最后几个函数之外,我的大部分代码都被删除了。
文件输出示例
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0020 2020 2020 200d 0a20 2020 2020
2020 2063 6f75 6e74 6572 2b2b 3b0d 0a20
2020 2020 2020 2066 616b 655f 6e75 6d62
6572 202f 3d20 3130 3b0d 0a20 2020 207d
0d0a 2020 2020 0d0a 2020 2020 0d0a 2020
当然有大约 400 行。
我不知道发生了什么,因此非常感谢任何帮助!我相信这可能是我在向量中放入多少行的限制?
我的代码
查找参数函数
string findParameters(string line, string outputFileName, vector<string> &list_parameters){
ofstream outFile;
outFile.open(outputFileName, ios::out);
int comma;
string something;
int length;
int parstart;
int parend;
int last;
if (outFile.is_open()) {
if (line.find("(") != string::npos) {
last = parstart = line.find("(",0) + 1;
if (line.find(")", parstart + 1) != string::npos) {
parend = line.find(")", parstart + 1) + 1;
do {
comma = line.find(",", last+1);
if (comma == string::npos) {
length = parend - last;
something = line.substr(last, length-1);
list_parameters.push_back("\n " + something);
}
else {
length = comma - last;
something = line.substr(last, length);
list_parameters.push_back("\n " + something);
last = comma+1;
}
} while (comma != string::npos);
}
}
outFile.close();
}
else {
cout << "\nfile find parameters did not open";
}
return "";
}
输出头函数
//Starting Header
//File Name
outFile << "/* \nFilename: " << outputFileName;
//Date
char date[9];
_strdate_s(date);
outFile << "\n\nDate: " << date << "\n";
//Description
outFile << "\nProgrammer: Dyrenex\n\nDescription:\n //Description of what the code in the file is meant to do and how it does what it is meant to do" << "\n";
outFile << "\n\n */ \n\n";
size_t found;
//Writing the Rest of Input File
while (isDone != existingFile.size()){
//Finding void functions
line = existingFile[isDone];
if (line.find("void") != string::npos){
//cout << "\nFound a void!" << "\n";
outFile << "\n/*Function: \nDescription:\n Description of the function\nParameters:" <<
"\n Parameters here\n Returns:\n returnVal:*/";
}
else if (line.find("int",0) != string::npos) {
int intstart = line.find("int");
if (line.find("(", intstart + 1) != string::npos) {
int parstart = line.find("(", intstart + 1);
if (line.find(")", parstart + 1) != string::npos) {
int parend = line.find(")", parstart + 1);
vector<string> list_parameters;
outFile << "\n/*Function: " << line.substr(intstart, parstart)
<< "\nDescription: \n Description of the function\nParameters:";
findParameters(line, outputFileName,list_parameters);
int counter = 0;
while (counter != list_parameters.size()) {
outFile << list_parameters[counter] << ": Description";
counter++;
}
outFile << "\n Returns:\n returnVal: Description\n*/";
}
}
}
//outputting file line
outFile << "\n" << existingFile[isDone];
isDone++;
}
outFile.close();
读取现有文件
ifstream inFile;
inFile.open(inputFileName, ios::in);
if (inFile.is_open()){
while (!inFile.eof()){
getline(inFile, line);
existingFile.push_back(line);
}
inFile.close();
}
*这不是我的作业!我将其作为一个辅助项目来自动将我的名字写在我的作业上,这样我就不必为每项作业都这样做了! *
非常感谢您!
我试图将标题放在我的问题中以使我的代码整洁,但如果您不喜欢我的问题的格式这里是我所有代码的链接 http://pastebin.com/4P5hFzQm
下面是我试图操作的 .cpp(输入文件)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int nDigits(long long number){
int counter;
for (counter = 0; number > 0; counter++){
number = number / 10;
}
return counter;
}
int reverse(long long number){
int reverse = 0;
while (number > 0){
reverse = reverse * 10;
reverse = reverse + (number % 10);
number = number / 10;
}
return reverse;
}
bool isPalindrome(long long number){
if (number == reverse(number)){
return true;
}
else{
return false;
}
}
bool repeatsDigit (long long number){
int temp[1024];
long long fake_number = number;
int counter = 0;
int limit = nDigits(number);
while (fake_number > 0){
temp[counter] = fake_number % 10;
counter++;
fake_number /= 10;
}
for (counter = 0; counter < limit; counter++){
for (int counter2 = 0; counter2 < limit; counter2++){
if (temp[counter] == temp[counter2] && counter != counter2){
return true;
}
}
}
return false;
}
void digitCount( long long n, int& eCount, int& oCount){
int temp[1024];
long long fake_number = n;
int counter = 0;
int limit = nDigits(n);
while (fake_number > 0){
temp[counter] = fake_number % 10;
counter++;
fake_number /= 10;
}
for (counter = 0; counter < limit; counter++){
if (temp[counter] % 2 == 0){
eCount++;
}
else{
oCount++;
}
}
}
int largest(long long n){
int temp[1024];
long long fake_number = n;
int counter = 0;
int limit = nDigits(n);
int largestnum = 0;
while (fake_number > 0){
temp[counter] = fake_number % 10;
counter++;
fake_number /= 10;
}
for (counter = 0; counter < limit; counter++){
if (largestnum < temp[counter]){
largestnum = temp[counter];
}
}
return largestnum;
}
int smallest(long long n){
int temp[1024];
long long fake_number = n;
int counter = 0;
int limit = nDigits(n);
int smallestnum = 10;
while (fake_number > 0){
temp[counter] = fake_number % 10;
counter++;
fake_number /= 10;
}
for (counter = 0; counter < limit; counter++){
if (smallestnum > temp[counter]){
smallestnum = temp[counter];
}
}
return smallestnum;
}
double average(long long n){
int temp[1024];
long long fake_number = n;
int counter = 0;
int limit = nDigits(n);
double averagenum = 0;
while (fake_number > 0){
temp[counter] = fake_number % 10;
counter++;
fake_number /= 10;
}
for (counter = 0; counter < limit; counter++){
averagenum += temp[counter];
}
return averagenum/nDigits(n);
}
int main(){
long long something = 12345;
int evenCount = 0;
int oddCount = 0;
/*real output*/
ifstream file;
file.open("integers.dat",ios::in);
if (file.is_open()){
file >> something;
cout << "The number of digits in " << something << " is " << nDigits(something) << "\n";
file >> something;
cout << "The reverse of : " << something << " is " << reverse(something) << "\n";
file >> something;
if (isPalindrome(something) == 1){
cout << "There is a Palindrome in number: " << something << "\n";
}
else{
cout << something << " is NOT a Palindrome" << "\n";
}
file >> something;
if (repeatsDigit(something) == 1){
cout << "There are repeat digits in " << something << "\n";
}
else{
cout << "There are NOT repeat digits: in " << something << "\n";
}
file >> something;
digitCount(something, evenCount, oddCount);
cout << "There are " << evenCount <<" Even and, " << oddCount <<" Odd in the number " << something << "\n";
file >> something;
cout << "The largest Number in " << something << " is " << largest(something) << "\n";
file >> something;
cout << "The smallest Number in " << something << " is " << smallest(something) << "\n";
file >> something;
cout << "The average Number in " << something << " is " << fixed << setprecision(1) << average(something) << "\n";
}
else {
cout << "File did not open";
}
return 0;
}
此外,输出文件是程序命名的新文件,因此您可以随意命名...这并不重要
再次感谢您,如果您有任何问题,请提出!我正在尽可能多地学习,这个网站也在帮助我做到这一点!
【问题讨论】:
-
这是一个 SO 问题的大量代码。
-
您显然正在努力提供大量信息以减少此处出现负面 cmets 的机会。我为这种努力鼓掌。但是,(请不要因此而气馁,我会尽力提供帮助),您没有对您为找出此问题的根源所做的任何努力进行任何描述。例如,如果您可以访问调试器,则通过它运行程序并查看当您达到 160 行阈值时会发生什么。想想不同的变量应该包含什么,然后看看它们实际包含什么。尝试解释差异,您可能会得到答案。
-
继续我之前的评论:这里有很多代码,几乎没有关于你有什么或没有尝试修复它的信息。因此,您期望其他人经历整个事情并为您解决问题。相反,应分段分析代码并找出明显有效的代码。然后消除(删除)工作代码并创建一个较小的有问题的示例代码。继续这样做,直到找到一个显示问题的最小示例。在那个阶段,如果你仍然不明白它为什么这样做(我打赌你会的),请发布最少的代码。您可能会得到更好的回应。
-
@Dyrenex 这一点也不麻烦。我试图描述一个调试过程,它对我有很大帮助,并且在这个过程中帮助我了解更多。恕我直言,这比仅仅为您提供问题的答案更有价值。希望你会有同样的经历。干杯,并希望您很快找到解决此问题的方法。 RSahu 发布的链接也非常有用。
-
findParameters打开输出文件进行写入,这会截断它。每次你调用它时它都会这样做。为什么会打开一个文件?