C 写入空文件不需要';t写入文件,写入过大文件将写入空文件

C 写入空文件不需要';t写入文件,写入过大文件将写入空文件,c,memcpy,fuse,C,Memcpy,Fuse,我正在为一个程序编写文件操作。但是,我在文件操作方面遇到了一些问题。write函数。我遇到的问题是: 尝试写入一个空文件(在vim中打开并立即保存,所以它显示为0L 0C writed),它根本不写入,并且保持内容不变,因此,如果文件先前包含“文本”,它仍将包含“文本” 尝试写入一个大文件(大约10KB)将导致一个空文件 对于空文件部分。我已经尝试过几种方法,例如检查大小是否小于1(我假设是写入空文件时给定的大小),并简单地将char*指向单个'\0'字节 我还尝试了单独的if案例,由于一些

我正在为一个程序编写文件操作。但是,我在
文件操作方面遇到了一些问题。write
函数。我遇到的问题是:

  • 尝试写入一个空文件(在vim中打开并立即保存,所以它显示为0L 0C writed),它根本不写入,并且保持内容不变,因此,如果文件先前包含“文本”,它仍将包含“文本”
  • 尝试写入一个大文件(大约10KB)将导致一个空文件
对于空文件部分。我已经尝试过几种方法,例如检查大小是否小于1(我假设是写入空文件时给定的大小),并简单地将
char*
指向单个
'\0'
字节

我还尝试了单独的if案例,由于一些奇怪的原因,我发现大小为-2,但是当我尝试编写一个空文件时,正如上面在找到-2时所解释的那样,它仍然不起作用

对于太大的文件,我不知道

static int fs\u write(常量字符*路径、常量字符*缓冲区、大小、偏移量、结构融合文件信息*ffinfo){
//查找关联的文件和指向该文件的目录。
file_t*file=从路径(path)获取文件;
dir\u t*directories=从路径(path)获取父路径;
//文件的内容存储在char*中,因此我必须重新定位
//上一个指针和memcpy将新内容从缓冲区复制到
//文件->内容,使用大小和偏移量指示大小
//制作realloc和复制内容。
char*file\u contents\u new=(char*)realloc(file->contents,(size+1)*sizeof(char));
//realloc失败
if(文件内容新==NULL)
return-ENOMEM;
//将上一个文件内容指针指向新分配的节。
文件->内容=文件内容\u新建;
//按提供的大小从缓冲区+偏移量复制到文件内容。
memcpy(文件->内容、缓冲区+偏移量、大小);
*(文件->内容+大小)='\0';//将空字符附加到结束文件字符串。
返回大小;
}
在这里,我也希望能够正确处理空文件和大文件,因为:

  • 大小0(对我来说最有意义)将realloc转换为大小为0+1的字符*(1表示空字节)
  • 然后将文件->内容指向它
  • 然后将0字节从缓冲区复制到文件->内容
  • '\0'
    字符写入文件->内容的末尾(大小为realloc'ed块-1的
    长度);在本例中,在第0个索引处写入
    '\0'
  • 返回写入的大小,在本例中为0
然而,vim关闭报告它已将0L 0C写入该文件,但该文件未被触动

大文件:

  • 该函数将多次调用write以将数据块写入文件
  • 但是,会写入一个空文件

    • 我不习惯融合,但我认为你没有很好地使用参数(请参阅)

      • 缓冲区
        :要写入的数据
      • size
        :缓冲区的大小
      • 偏移量
        :文件中要写入的位置
      因此,您的代码如下所示:

      static int fs_write(const char* path, const char* buffer, size_t size, off_t offset, struct fuse_file_info* ffinfo) 
      {
        // Find the associated file_t* and dir_t* to the file.
        file_t* file = get_file_from_path(path);
        dir_t* directories = get_parents_from_path(path);
      
      
          /* realloc to store data. Note the +1 to store the final \0 */
          char* file_contents_new = realloc(file->contents, file->size + size+1);
      
          // realloc failed
          if (file_contents_new == NULL)
              return -ENOMEM;
      
      
          //  point the previous file contents pointer to the newly allocated section.
          file->contents = file_contents_new;
      
          /* update size too, without to +1 to prevent adding one at each write call */
          file->size = file->size + size;
      
          // Copy buffer to the file taking offset into account
          memcpy(file->contents + offset, buffer, size);
      
          /* Append NULL char to end file string. */
          *(file->contents + file->size) = '\0'; 
      
          return size;
      }
      

      你的
      realloc
      调用看起来很奇怪,不应该是
      realloc(文件->内容,大小+文件->大小)之类的东西吗?@Mathieu我试过
      realloc(文件->内容,strlen(文件->内容)+使用大小+1)它没有改变任何东西。我假设
      size
      是缓冲区的新大小。它将覆盖数据,而不是附加数据。因此,如果我想在文件中写入“test”,它将realloc为大小为4+1的char*以生成“test\0”。因此,我只需
      4+1*sizeof(char)
      写入“test”,然后追加空字节。此函数每次都用新值覆盖文件内容。您需要说明如何调用此函数。问题可能是我用来理解“偏移量”含义的源代码。他们将其描述为
      -offset:choset from where chunk start
      ,我将其解释为缓冲区中的偏移量。但是,在文件上使用偏移量更有意义。但是,它仍然不是固定的。有没有可能写操作失败,因为read函数也是错误的?或者这不应该影响写作。