gpt4 book ai didi

c - C 中的 "write"系统调用无法识别来自 "read"系统调用的随机整数

转载 作者:行者123 更新时间:2023-11-30 15:35:19 25 4
gpt4 key购买 nike

我试图使用系统调用“write”将固定数量的随机整数写入文件,然后检查它们是否正确写入。为了做到这一点,我调用“read”函数,然后我逐个读取所有文件内容,并将它们打印到另一个文件中。

问题是,虽然 write 函数正确写入了随机整数(大小为 500),但 read 函数能够提取其中的 200 个,然后返回其余 300 个垃圾。有时,它只返回其中的 10 个。他们。每次我运行代码时,它都会有不同的行为。

我已经检查“写入”函数是否通过将所有数字打印到另一个文件(例如 file1)来正确写入所有数字。但是,打印“read”函数返回的数字(例如 file2)表明它们并不完全相同。

我意识到,如果我使用单个数字(例如 5)而不是随机整数,那么一切都可以正常工作。我用谷歌搜索了很多,检查了是否正确打开/关闭文件,但无法解决问题。

这是我的 C 代码。我删除了一些错误检查以便向您展示一个小脚本。你能帮我吗?

int main()
{
srand ( time(NULL) );

// write
int fd = open("file_test_1", O_CREAT | O_WRONLY);
int val;
if (fd != -1) {
for(int i=0;i<500;i++){
val = (int) rand()%500;
// val = 5;
write(fd, &val, sizeof(val));
}
}
close(fd);

FILE * file_check;
file_check=fopen("file_test_1_check","w");

// test read
fd = open("file_test_1", O_RDONLY);
int new_val;
int x;
if (fd != -1) {
while( ( x = read(fd, &new_val, sizeof(new_val)) )>0 ){
fprintf(file_check,"%d\t\t%d\n",new_val, x);
}

}
close(fd);
fclose(file_check);
return 0;
}

最佳答案

当您使用O_CREAT打开文件时,需要为后续用户设置文件权限。您可以通过指定 pmode 来实现这一点,即 OR 标志 S_IREAD S_IWRITE 的组合(继续并使用两者)。另外,由于您正在编写二进制文件,因此使用 O_BINARY 通知系统不会有什么坏处。所以正确的open是:

int fd = open("file_test_1", O_BINARY | O_CREAT | O_WRONLY | S_IREAD);

现在,当您重新打开该文件时,您确实需要以二进制形式打开它,因此正确的后续打开方式是:

fd = open("file_test_1", O_RDONLY | O_BINARY);

关于c - C 中的 "write"系统调用无法识别来自 "read"系统调用的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com