C++中的神秘:函数调用行为不端只是因为存在另一个函数调用,即使它们是不相关的

MYSTERY IN C++: Function call misbehaving just because of the presence of another function call even though they are unrelated

本文关键字:函数调用 不相关 另一个 是因为 行为不端 C++ 存在      更新时间:2023-10-16

我的程序在文件中搜索字符串,返回行号,然后将文件中搜索到的字符串的行号之前的所有行复制到另一个文件中。但令我最惊讶的是,我认为这是一个谜;

  1. 当搜索到的字符串行号被传递给文件复制函数时,它不会像文件复制函数中定义的那样复制搜索字符串行号之前的所有行,而是执行相反的操作
  2. 如果我在文件复制函数中更改为大于,即它应该复制搜索字符串行号之后的所有行,则根本不复制任何内容
  3. 如果我在文件复制函数中手动输入行号,即不使用返回的搜索字符串行号,则会发生与上面的1和2中相同的情况
  4. 最后,如果我删除了搜索字符串函数,并手动在复制文件函数中输入行号,那么在两个方向上都可以正常工作,即复制行号之前或之后的行。真的,这是个谜。请世界卫生组织帮忙

这是程序

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <string>
std::ifstream fin;
std::ofstream fout;
void Copyfile(std::ifstream& in_stream, std::ofstream& out_stream, std::string Line,int searchstringline);
int searchString(std::ifstream& in_stream, std::string string1);
int main(){
fin.open("C++.txt");
if (fin.fail())
{
std::cout << "Output file opening failed.n";
exit(1);
}
fout.open("Temp.txt",std::ios::app);
if (fin.fail())
{
std::cout << "Input file opening failed.n";
fin.close();
exit(1);
}
int searchstringline;
searchstringline = searchString(fin, "main");
Copyfile(fin, fout, "line", searchstringline);

}

void Copyfile(std::ifstream& in_stream, std::ofstream& out_stream, std::string Line, int searchstringline){
int count = 0;
for (int i = 0; getline(fin,Line); i++){
count++;
while (count < searchstringline){
out_stream << Line << std::endl;
break;
}
}

}
int searchString(std::ifstream& in_stream, std::string string1){
std::string input;
int number = 0;
for (int i = 0; getline(fin, input); i++){
number++;
if (input.find(string1) != std::string::npos){
break;
}
}
return number;
}

这个谜团的解决方案只是在调用searchstring函数后关闭文件,然后在调用copyfile函数之前重新打开它。通常,当您有多个函数访问一个文件时,这是可取的,以避免在调用另一个函数以使用该文件后由于函数反射而导致的失真。干杯