C++中的神秘:函数调用行为不端只是因为存在另一个函数调用,即使它们是不相关的
MYSTERY IN C++: Function call misbehaving just because of the presence of another function call even though they are unrelated
我的程序在文件中搜索字符串,返回行号,然后将文件中搜索到的字符串的行号之前的所有行复制到另一个文件中。但令我最惊讶的是,我认为这是一个谜;
- 当搜索到的字符串行号被传递给文件复制函数时,它不会像文件复制函数中定义的那样复制搜索字符串行号之前的所有行,而是执行相反的操作
- 如果我在文件复制函数中更改为大于,即它应该复制搜索字符串行号之后的所有行,则根本不复制任何内容
- 如果我在文件复制函数中手动输入行号,即不使用返回的搜索字符串行号,则会发生与上面的1和2中相同的情况
- 最后,如果我删除了搜索字符串函数,并手动在复制文件函数中输入行号,那么在两个方向上都可以正常工作,即复制行号之前或之后的行。真的,这是个谜。请世界卫生组织帮忙
这是程序
#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函数之前重新打开它。通常,当您有多个函数访问一个文件时,这是可取的,以避免在调用另一个函数以使用该文件后由于函数反射而导致的失真。干杯
相关文章:
- C++,QT. QShortcut的函数调用不存在
- C++函数调用不起作用
- 循环迭代后,C 函数调用不会再次调用
- 结构构造函数调用不明确
- 可以't更改船舶位置,函数调用不起作用
- 函数调用不起作用,矢量访问数据
- 功能参数与函数调用不匹配
- C++ 与函数调用不匹配
- 函数调用不起作用
- 析构函数体内的函数调用不起作用
- 为什么这些重载函数调用不明确
- boost库更新后,模板函数调用不起作用
- 函数调用不显示 cout
- 静态函数调用不起作用 (C++)
- 为什么此函数调用不明确
- 调试从 C# 到 C++/CLI 到 C++ 的函数调用不起作用
- C++引用和返回的函数调用不符合预期。
- 伪析构函数调用不会销毁对象
- 由于超类(按值传递)导致重载构造函数调用不明确
- 显式析构函数调用不起作用