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)将导致一个空文件
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字节从缓冲区复制到文件->内容
- 将
字符写入文件->内容的末尾(大小为realloc'ed块-1的'\0'
长度);在本例中,在第0个索引处写入
'\0'
- 返回写入的大小,在本例中为0
- 该函数将多次调用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函数也是错误的?或者这不应该影响写作。