【发布时间】:2019-01-25 00:54:23
【问题描述】:
我在网上阅读 GNU C PROGRAMMING TUTORIAL,对低级读写的代码示例有些困惑。
代码如下:
#include <stdio.h>
#include <fcntl.h>
int main()
{
char my_write_str[] = "1234567890";
char my_read_str[100];
char my_filename[] = "snazzyjazz.txt";
int my_file_descriptor, close_err;
/* Open the file. Clobber it if it exists. */
my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC);
/* Write 10 bytes of data and make sure it's written */
write (my_file_descriptor, (void *) my_write_str, 10);
fsync (my_file_descriptor);
/* Seek the beginning of the file */
lseek (my_file_descriptor, 0, SEEK_SET);
/* Read 10 bytes of data */
read (my_file_descriptor, (void *) my_read_str, 10);
/* Terminate the data we've read with a null character */
my_read_str[10] = '\0';
printf ("String read = %s.\n", my_read_str);
close (my_file_descriptor);
return 0;
}
我用 gcc 编译代码没有问题。并且第一次运行,也是可以的。输出如下:
$ ./lowLevelWrite
String read = 1234567890.
当我第二次运行程序时出现问题:
$ ./lowLevelWrite
String read = .
似乎代码第二次无法将字符串“1234567890”写入文件。正如我们从 GNU C 手册中知道的那样,O_RDWR | O_CREAT | O_TRUNC 这些标志应该允许我们每次将文件截断为 0,然后写入文件。我不确定为什么第二次执行失败。
谁能帮我摆脱这种困惑?
【问题讨论】:
-
最有可能的是,该文件是在没有足够权限的情况下创建的,如果该文件已经存在,您可以覆盖该文件。检查 open 的返回码,我敢打赌你会看到它返回 -1 而不是有效的文件句柄。
-
如果您使用的教程确实省略了所有错误处理,您应该立即停止使用它。这样的教程是不负责任的。
-
ls -l snazzyjazz.txt会非常详细地说明为什么会发生这种情况。 -
非常感谢您的帮助,我亲爱的朋友。我喜欢stackoverflow,所有问题都可以在这里找到答案。
标签: c low-level-io