我的程序(下面)将(带有 pwrite())文本写入文件并从文件中读取(使用 pread())。我的问题是pread函数没有从文件中读取我的文本和close函数有什么问题(程序的最后一部分)?结果在第二部分。我的错误在哪里?
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
int fd, nr, nr2, nw, nw2;
char fl_nm[]={"file_io/pwrite.txt"};
char buf_wr[]={"hello everyone this is first text\n"};
char buf_wr2[]={"Did you miss me? Don't afraid\n"};
char buf_rd[120];
char buf_rd2[120];
//open file
fd = open(fl_nm, O_RDWR|O_CREAT, 0777);
nw = pwrite(fd, &buf_wr, strlen(buf_wr), 14);
//error checking
if(fd == -1){
perror("[error in open]\n");
}
else if(nw == -1){
perror("[error in write]\n");
}
else{
/*if open and write process are okey, read first write data
* from file*/
nr = read(fd, &buf_rd, sizeof(buf_rd));
//display succeeded message about first write and open process
printf("[file is opened]\n");
printf("[succeeded write(1) process]\n");
//read process error control
if(nr == -1){
perror("[error in read]\n");
} else{
printf("[reading(1) data] from %s\n", fl_nm);
printf("[%s]\n", buf_rd);
}
}
//second write process.
nw2= pwrite(fd, &buf_wr2, strlen(buf_wr2), 30);
//write error checking
if(nw2 == -1){
perror("[error in write 2]\n");
}else{
/*if write process is correct
* second read process*/
nr2 = read(fd, &buf_rd2, sizeof(buf_rd));
printf("-----------------------------------\n");
printf("[succeeded write(2) process]\n");
printf("[reading(2) data] from %s\n", fl_nm);
printf("[%s]\n", buf_rd2);
}
//close file
close(fd);
//error checking for close process
if(close(fd) == -1){
perror("[error in close]\n");
}else{
printf("[succeeded in close]\n");
}
return 0;
}
结果:
$ gcc pwrite.c -o pwrite
$ ./pwrite
[file is opened]
[succeeded write(1) process]
[reading(1) data] from file_io/pwrite.txt
[]
-----------------------------------
[succeeded write(2) process]
[reading(2) data] from file_io/pwrite.txt
[]
[error in close]
: Bad file descriptor
答案 0 :(得分:2)
1)close()
失败,因为您正在关闭文件两次:
//close file
close(fd);
//error check close process
if(close(fd) == -1){
第一次调用close(fd);
后,fd
变得不确定,第二次调用close(fd)
失败。您只需删除对close(fd);
的第一次调用。
2)您正在打印buf_rd
,好像它是一个C字符串。 read()
不会使用空字节终止buf_rd
。
3)您使用pwrite()
以随机偏移(14和30)编写。但read()
从当前偏移读取 - 这意味着起始字节可能是空字节,因此%s
立即停止打印(即不打印任何内容)。你阅读的内容比你写的要多得多。这意味着read()
将返回少于请求的字节数。因此,使用read()
的返回值来获取成功读取的字节数。
而是使用循环打印每个字节:
for (size_t l = 0; l < nr; l++)
printf("%c", buf_rd[l]);
和
for (size_t l = 0; l < nr2; l++)
printf("%c", buf_rd2[l]);
答案 1 :(得分:1)
你错误地使用了指针,访问数组的地址应该只有他们的名字,而不是&amp; name。
用buf_wr替换&amp; buf_wr,用&amp; buf_wr访问不正确的地址写入会损坏你的堆栈以及堆栈中定义的变量
修改强>
替换
nw = pwrite(fd, &buf_wr, strlen(buf_wr), 14);
到
nw = pwrite(fd, buf_wr, strlen(buf_wr), 14);
以及所有其他实例..