文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

【字号: 日期:2023-03-20浏览:14作者:雯心

问题描述

C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件,这是怎么回事?

注: Win7 x64 ,账户是Administrator 管理员账户,没有UAC,直接就是管理员.

#include <iostream>#include <fstream>using namespace std;int main(int argc, char const *argv[]) { fstream file('test.txt',ios::in|ios::out); file.open('test.txt',ios::in|ios::out); char c; cin>>c; while(c!=’X’){cin>>c;cout<<'Get a :'<<c<<endl; } return 0;}

文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

点完确定之后:出现另存为对话框,结果可以覆盖.

文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

程序还在运行中呢,文件却已经被修改了.

文件锁 - C++ fstream 以ios::out|ios::in 方式打开txt文件,程序运行中记事本却可以修改文件?

原本直接用 sublimetext 是无法修改的,但经过记事本一折腾,现在sublimetext 也能修改了.

求教,如何能在程序运行过程中,禁止其他程序写和删除某个文件,但是可以读.谢谢.

问题解答

回答1:

先说你的问题:记事本覆盖旧文件后,进程打开的文件是以前的文件(以前的文件还在,只不过你看不到了),你再次去编辑的文件已经是一个新的文件,

在linux下面即使是强制性锁也是可以绕开的,unlink就可以绕开,所以linux下是没有办法的避免这种问题,

windows下面系统API应该提供了某些功能,不过我太了解,因为经常会发现:“该文件被进程占用,无法删除”, 但是不排除绕开这种限制

回答2:

这个问题还是比较有意思的.排查问题的思路可以是这样的:

是不是文件IO缓存的问题? 编辑器--系统缓冲区---实体文件

是不是文件读写锁的问题? (看到你的代码虽然是以可读可写的方式打开文件,建立关联,但是只用到了读;读锁貌似不排他)

相关文章: