繁体   English   中英

覆盖文件而不是附加到它?

[英]Overwrite a file instead of appending to it?

我是一名新手 linux 程序员,被要求成为我同事的一名程序员。

我用这一行打开了一个文件:

err = open("path/foo.txt", O_RDWR | O_CREAT,0777);

现在我写入它,并十六进制转储文件,output 显示我附加了新内容而不是覆盖原始内容。

我该如何覆盖?

另外,如果您问我“什么是“开放的”? 我会参考新手辩护并说我不知道。 我知道的最接近的事情是 fopen,但我不知道我的同事正在使用什么库/框架。 可能是posix?

如果你通过man 2 open open(2)的手册,你会发现一个接受标志的列表。

无论如何,您都应该阅读手册页,这并不难,您唯一需要记住的是,您可以通过按/来搜索关键字, n / N用于在找到的内容之间跳转,而q则在您退出时退出重新完成,其他一切都是多余的,可能只会加快一点速度。

您正在寻找的标志是

O_TRUNC
If the file already exists and is a regular file and the access mode allows
writing (i.e., is  O_RDWR  or O_WRONLY)  it  will be truncated to length 0.
If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored.
Otherwise, the effect of O_TRUNC is unspecified.

所以你所要做的就是在你想完全覆盖文件时添加这个标志。

但是如果可以的话,你应该使用fopen(3) ,在这种情况下你正在寻找的modew+ ,它相当于O_RDWR | O_CREAT | O_TRUNC O_RDWR | O_CREAT | O_TRUNC O_RDWR | O_CREAT | O_TRUNCopen(2)中。

open(2)是一个低级系统调用,有效且正确地从原始文件描述符中读取并不是那么简单,另一方面,您从fread(3)获得的FILE*是一种实现,可以处理大部分细节,例如为您缓冲,除非你能做得更好,否则你不应该回避它。


顺便说一句,很少需要0777文件权限并且不适用于常规文件,我建议您使用0666打开普通文本文件,它可以满足您的所有需求,但不能使其作为程序执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM