Der*_*ger 5 c linux file-io file append
这是家庭作业的一部分.好吧,我的作业无法正常工作,所以我已经把一个片段拿出来并开始用它来弄清楚什么是错的.
在C语言的Linux上我试图打开/创建一个文本文件,给它写一些东西,关闭它,在读/写和追加模式下打开它,然后在它的末尾添加任何东西(在这个例子中,字符串",老兄").但是没有附加任何内容,但write方法也没有抛出错误.我不确定是什么.
这是代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define BUFFSIZE 4096
int main(){
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode);
char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};
size_t n = sizeof(buf);
if(write (fd, buf, n) < 0){
printf("Error in write\n");
printf("%s", strerror(errno));
return 1;
}
close(fd);
int fd2 = open("tempfile.txt", O_RDWR | O_APPEND);
printf("appending dude:\n");
char buf2[6] = {',', ' ', 'd', 'u', 'd', 'e'};
size_t p = sizeof(buf2);
if(write (fd2, buf2, p) < 0){
printf("Error in write\n");
printf("%s", strerror(errno));
return 1;
}
char buf3[BUFFSIZE];
lseek(fd2, 0, SEEK_SET);
if(read (fd2, buf3, BUFFSIZE) < 0){
printf("Error in read\n");
printf("%s", strerror(errno));
return 2;
}
int i;
for (i = 0; i < strlen(buf3); ++i){
printf("%c", buf3[i]);
}
printf("\n");
close(fd2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图通过搞乱一些不同的组合,将模式变量更改为S_IRWXU来消除严格意义上的权限问题.S_IRWXG | S_IRWXO,在我的第二个open语句中将模式作为第三个参数传递,只在第二个open语句中以append模式打开文件,在第二个open语句中将append模式作为第三个参数传递,等等.
我能做的最好的就是在没有APPEND模式的情况下在RDWR中打开它,然后直接在现有文本上写...但这不是我想要的.请注意,我知道像lseek这样的东西,但这里的目的是严格使用追加模式将文本添加到文件的末尾.我不想lseek.
看到这个的任何线索?我确定有一些显而易见的东西,我只是不明白.
非常感谢.
您尝试写入的字节数不正确,
char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};
size_t n = sizeof(buf);
if(write (fd, buf, n) < 0){
Run Code Online (Sandbox Code Playgroud)
而不是你应该做的
char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l', '\0'};
size_t n = strlen(buf); //use strlen
if(write (fd, buf, n) < 0){
Run Code Online (Sandbox Code Playgroud)
同样,对其他写入和读取也执行此操作。如果你没有'\0'在文件中写入终止字符串,那么当你从文件中读取数据时,你将不会得到它。
在阅读时,您应该尝试直到读取整个文件,即。你得到EOF。
| 归档时间: |
|
| 查看次数: |
17176 次 |
| 最近记录: |