很简单I/O

Very simple I/O

所以我正在尝试对文件做一些非常简单的 read/writes。因为它是一个作业,所以我不能使用更复杂的函数 File*.

我可以很容易地创建一个文件并写入它,但是如果我尝试读回我的内容(内容相同,但我的问题归结为这个)我没有得到我期望的,我不能看看为什么。

这是导致我出现问题的代码片段:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
        int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND);
        char buff [20] = "Just a short text!!!";
        write(fdisk, buff, sizeof(buff));
        char buff2[20];
        read((fdisk), buff2, sizeof(buff2));
        printf("Context of deleted file: %c\n",buff[1]);
        printf("Context of deleted file: %c\n",buff2[1]);
        return 0;
}

创建文件时需要指定文件访问模式:

int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND, 0666);

否则访问模式是一些不确定的值。

在回读之前,您需要倒带:

lseek(fdisk, 0, SEEK_SET); // rewind

问题是 write 调用使文件描述符仅指向 写入的数据之后(因此更多的写入将在之后进行,而不是覆盖相同的数据数据),所以下面的 read 调用尝试在写入数据之后读取数据,但可能什么也得不到。

我认为这是问题的组合:

  • 您没有倒回或重新打开文件,因此当您阅读时,您总是从文件末尾开始阅读。
  • 您正在使用追加模式,因此它会将数据添加到文件末尾。这意味着在第一个 运行 之后,您将在文件末尾写入数据,但始终从头开始读取(假设您解决了第一个问题)。
  • 您没有设置权限,因此您获得了随机文件权限,并且文件在创建后可能无法读取。
  • 您的打印语句仅打印每个缓冲区中的第二个字符,而不是完整的字符串。

这是一个最小的工作示例。这编译并 运行s 在我的机器上得到预期的结果。

#include <stdio.h>                                                               
#include <fcntl.h>                                                               
#include <unistd.h>                                                              
int main(int argc, char** argv){                                                 
  int fdisk = open("testfile.txt", O_RDWR | O_CREAT, 0666);           
  char buff[] = "Just a short text!!!";                                          
  write(fdisk, buff, sizeof(buff));                                              
  lseek(fdisk, 0, SEEK_SET);                                        
  char buff2[sizeof(buff)];                                                      
  read((fdisk), buff2, sizeof(buff2));                                           
  printf("Context of deleted file: %s\n",buff);                                  
  printf("Context of deleted file: %s\n",buff2);                                 
  return 0;
}

最后一点,您正在使用的函数 (read/write) 所有 return 值都指示操作是否成功。你应该检查一下。他们会指出您问题中的读取操作实际上并未读取任何数据(因为它位于文件末尾)。