2012-07-17 75 views
2

如果C++在读取文件(比如说有20000行的csv文件)时读取的过程如何,另一个过程删除文件(可以说它是一个ifstream)。C++,如果文件在读取时移动会发生什么?

我是否遇到seg故障,或者存储行的向量只有10,000行,并且没有错误表明出现了问题?

同样,如果我通过ofstream进行书写并且被删除打断,会发生什么?在这种情况下,如果中断处于中途,我的输出文件是否只包含最后的10,000行?

+0

为什么不直接在文件上读取锁定以防止文件在打开时被移动? – vcsjones 2012-07-17 20:57:30

+2

Windows(以及我假定其他操作系统)可以防止一个进程更改其他进程使用的文件(因此“无法删除此文件”错误)。 – 2012-07-17 20:58:36

+1

你为什么不试试? 'int main() { std :: ifstream ifs(“test.txt”); std :: cin.get(); }'现在尝试删除文件,然后在控制台中输入任何内容。 – jrok 2012-07-17 21:00:27

回答

3

这取决于一个操作系统。

如果您使用的是Unix-y操作系统,您将继续读取/写入数据,因为删除仅仅是对包含目录和/或inode的更新,因此您不会影响文件的数据。但是,如果磁盘块所在的文件数据所在的位置可能会被新文件重新使用(也取决于操作系统),那么您将在读完数据后基本读取错误的文件数据缓冲区。

如果您在Windows上,正如Seth Carnegie在注释中正确指出的那样,如果文件打开以供阅读,则文件会自动锁定(并因此不可删除)。

+3

如果存在访问该文件的进程,块将不会被重用。 – 2012-07-17 21:02:05

+0

@KarolyHorvath - 我想知道NFS/AFS/etc是否适用? – DVK 2012-07-17 21:04:02

+0

很好的问题.. NFS不是POSIX compilant,但我的猜测是没关系。 – 2012-07-17 21:06:11

-1

这是高度系统依赖我猜。由于Linux可能会继续工作,而Windows会给你一些头痛的问题。

+3

即使窗户并没有那么糟糕。 – jrok 2012-07-17 20:58:59

+2

爱不请自来的微软抨击无知的黑客。 – 2012-07-17 21:30:50

+1

是的,Windows使用时会拒绝删除文件。 – 2012-07-17 21:47:44

相关问题