非常简单的I / O.

时间:2015-03-24 17:38:26

标签: c system-calls

所以我试图对文件进行一些非常简单的读/写操作。因为它是一个赋值,所以我不能使用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;
}

3 个答案:

答案 0 :(得分:1)

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

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

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

在阅读之前,你需要回顾它:

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

答案 1 :(得分:1)

问题是write调用使文件描述符在写入数据之后只指向(因此更多的写入将在此之后而不是覆盖相同的数据),因此跟随read调用尝试在写完之后读取数据,并且可能什么都没有。

答案 2 :(得分:1)

我认为这是一系列问题:

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

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

#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;
}

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