【发布时间】:2014-05-23 11:41:48
【问题描述】:
我正在尝试使用系统调用“write”将固定数量的随机整数写入文件,然后检查它们是否正确写入。为此,我调用了“读取”函数,然后逐个整数地读取所有文件内容并将它们打印到另一个文件中。
问题在于,尽管 write 函数正确写入了随机整数(大小为 500),但 read 函数能够提取其中的 200 个,然后返回其余 300 个的垃圾。有时,它只返回 10 个他们。每次我运行代码时,它都有不同的行为。
我已检查“写入”功能是否通过将所有数字打印到另一个文件(例如 file1)来正确写入它们。但是,打印“读取”函数返回的数字(例如 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;
}
【问题讨论】:
-
你得到的数据和垃圾的例子?
-
刚刚试了一下。工作正常。需要更多信息。
-
我刚刚试了一下,使用 S_IWUSR 作为第一个 open 调用的第三个参数,设置文件所有者的读取权限。它仍然无法正常工作。
-
好吧,我打印到 file_test_1_check 随机数和读取函数中的字节。所以,我第一次执行代码,我得到了类似的结果: 492 4, 177 4 ... 200 行。但是,在第二次执行中,我得到了 300 行,然后是 90368 4, 127488 4, ... 其他 100 行。
-
非常适合我。您可以尝试发布最小的完整可编译代码来重现您的症状。
标签: c random integer system-calls