C++ 为什么不是';我的重命名文件不工作吗?

C++ 为什么不是';我的重命名文件不工作吗?,c++,io,file-rename,C++,Io,File Rename,我在重命名文件时遇到问题。我正在尝试删除现有文件的几行,并用新文件替换它 string line; ifstream myfile(filename); ofstream outfile; outfile.open(filename.append(".new")); if(myfile.is_open()) { //loop here that runs through code and calles //outfile << line; repe

我在重命名文件时遇到问题。我正在尝试删除现有文件的几行,并用新文件替换它

string line;   
ifstream myfile(filename);  
ofstream outfile;  
outfile.open(filename.append(".new"));  

if(myfile.is_open()) {
    //loop here that runs through code and calles
    //outfile << line; repeatedly
}

int test = rename(filename.append(".new").c_str(),filename.c_str());
if (test == 0) cout << "Success";
else cout << "Failure";
字符串行;
ifstream myfile(文件名);
出流孔的直径;
outfile.open(filename.append(“.new”);
如果(myfile.is_open()){
//循环,该循环在代码和调用中运行

//outfile由于两个文件仍处于打开状态,因此该文件似乎失败。在文件被锁定时,很可能无法重命名该文件。请在尝试重命名之前关闭该文件

此外,您需要先删除原始文件,然后才能重命名

在伪代码中,您需要执行以下操作:

  • 打开原始文件
  • 打开临时文件。新建文件
  • 完成你所做的任何任务
  • 关闭两个文件
  • 删除原始文件
  • 改名

当C++调用“<代码>重命名< /代码>失败时,您的C++实现可能会设置<代码> ErnOn/Cuth.>因此,您应该检查<代码> ErnOn/Cuth>的值,以找出调用失败的原因。请熟悉错误报告机制,这样您就可以自己诊断问题。

因为它看起来是失败的。您仍然打开了这两个文件。在文件被锁定时,您很可能无法重命名该文件。请在尝试重命名之前关闭该文件

此外,您需要先删除原始文件,然后才能重命名

在伪代码中,您需要执行以下操作:

  • 打开原始文件
  • 打开临时文件。新建文件
  • 完成你所做的任何任务
  • 关闭两个文件
  • 删除原始文件
  • 改名

当C++调用“<代码>重命名< /代码>失败时,您的C++实现可能会设置<代码> ErnOn/Cuth>。因此,您应该检查<代码> ErnOn/Cuth>的值,以找出调用失败的原因。请熟悉错误报告机制,以便自己诊断问题。

您是否在ATTE之前关闭新文件?mpting是否重命名?请注意(即使在尽可能工作的情况下),如果存在硬链接,则可能/将失败--当您“删除”时在现有文件中,您只删除从文件名到内容的链接。链接到相同内容的其他名称仍将链接到旧文件,而不是新文件。您是否在Windows上运行?如果是这样,您需要确保在执行重命名之前关闭所有打开的旧文件句柄,否则它将失败,并出现
ERROR\u SHARINGyRebug  >或替代地,以兼容的共享模式打开文件,但这需要放弃C++(代码)> IOSWATE./COD> API,以支持类似于原始系统调用的功能。@ JeyycFin我不一定会认为是失败。在某些情况下,它可以是一个非常有效和有用的对接语义。当然,需要注意的是,这取决于更大的上下文到底是什么……您是否在尝试重命名新文件之前关闭了它?请注意(即使在尽可能工作的情况下),如果存在硬链接,这可能会失败--当您“删除”时在现有文件中,您只删除从文件名到内容的链接。链接到相同内容的其他名称仍将链接到旧文件,而不是新文件。您是否在Windows上运行?如果是这样,您需要确保在执行重命名之前关闭所有打开的旧文件句柄,否则它将失败,并出现
ERROR\u SHARINGyRebug  >或替代地,以兼容的共享模式打开文件,但这需要放弃C++(代码)> IOSWATE./COD> API,以支持类似于原始系统调用的功能。@ JeyycFin我不一定会认为是失败。在某些情况下,它可以是一个非常有效和有用的对接语义。当然,需要注意的是,这取决于更大的上下文是什么……好吧,我包括了myfile.close();outfile.close();remove(filename.c_str());rename(filename.append(“.new”).c_str(),filename.c_str();现在当我检查我的目录时没有“.new”文件,只是未更改的原始文件。所以,写一些不同的文件!看起来你只是在循环中复制它。另外,问题是为什么调用重命名失败。我想我肯定回答了。我正在写一些不同的文件。我正在删除其中的几行,我只是不想把我的帖子弄得乱七八糟h转换的细节,因为这可能只是重命名文件的问题。尽管关闭了两个文件并假定删除了原始文件,但重命名仍然失败。如果关闭了原始文件的所有打开的文件句柄,则删除将起作用。如果关闭了新文件的所有打开的文件句柄,则重命名将起作用。我猜你的代码有点不对劲。当然,我现在看不到你的代码。我建议你按照我最后一段中的建议去问运行时有什么问题。好的,我包括了myfile.close();outfile.close();remove(filename.c_str());rename(filename.append(“.new”).c_str(),filename.c_str());现在,当我检查目录时,没有“.new”文件,只是未更改的原始文件。所以,写一些不同的文件!看起来你只是在循环中复制它。另外,问题是为什么调用重命名失败。我想我肯定回答了。我正在写一些不同的文件。我正在删除其中的几行,我只是不想把我的帖子弄得乱七八糟h转换的细节,因为这可能只是重命名文件的问题。尽管关闭了两个文件并假定删除了原始文件,但重命名仍然失败。如果关闭了原始文件的所有打开的文件句柄,则删除将起作用。如果关闭了新文件的所有打开的文件句柄,则重命名将起作用。我想你的代码有点不对劲。当然