C 使用fread读取包含空字符和文本的完整文本文件

C 使用fread读取包含空字符和文本的完整文本文件,c,linux,file,filesystems,fread,C,Linux,File,Filesystems,Fread,我正在尝试设计一个小文件系统。 我已经创建了一个文本文件来存储文件数据 int kufs_create_disk(char* disk_name, int disk_size){ FILE* file_ptr = fopen(disk_name, "w"); if (file_ptr == NULL) return -1; fseek (file_ptr, disk_size * 1024-1, SEEK_SET); fwrite("",

我正在尝试设计一个小文件系统。 我已经创建了一个文本文件来存储文件数据

int kufs_create_disk(char* disk_name, int disk_size){

    FILE* file_ptr = fopen(disk_name, "w");
    if (file_ptr == NULL) 
        return  -1;
    fseek (file_ptr, disk_size * 1024-1, SEEK_SET); 
    fwrite("", 1, sizeof(char), file_ptr); // to make a size for the file 
    fclose(file_ptr);
    DiskName=disk_name;
    return 0;
}
写入文件后,我得到一个文件,其大小由我调用函数时确定

 kufs_create_disk("test.txt", 5);
它使用
'\0'
创建一个大小为5KB的文件,以将此文件填充到该大小。 我已经创建了另一个函数,可以在文件的不同位置写入该文件,它工作得很好,为了简单起见,我不会粘贴代码。 当我尝试使用
fread()
读取文件时,我没有获得写入内存的所有数据;相反,我只得到了一些数据

我的read实现将是:

int kufs_read(int fd, void* buf, int n){    
    FILE *file_ptr= fopen("test.txt","a+");
    fseek (file_ptr, FAT[fd].position, SEEK_SET); //where FAT[fd].position is where I want to start my read and fd is for indexing purposes 
    fread(buf, 1, n, file_ptr); //n is the number of bytes to be read
    FAT[fd].position = FAT[fd].position + n;
}
问题是文件读取了一些写入的字符,而不读取其余的字符。我做了一个小测试,在整个文件中循环,检查是否每件事都在读取,并且
fread
读取每件事,但在buf中,我只得到了我写的一些字符

文本文件如下所示:

0\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00written string1written string2 0\00\00\00\00\00\00\00\00\00\00\00\000\00\00\00\00\00\00\00\00\00\00\00\00writtenstring 3 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00
例如,我在缓冲区中得到了writtenstring1和writtenstring2,但没有得到WrittenString3


你能解释一下原因吗

作为一个术语问题,文本文件不包含空字节-除非文本采用UTF-16之类的编码,因此字节不再相关。“为了简单起见,我不会粘贴代码”好的,但是您发布的代码没有您描述的问题。或者至少有太多缺失的部分无法复制问题。这就是为什么寻求调试帮助的问题(为什么这段代码不起作用?)必须包括一个。我的问题是/00是否会影响字符串字符(如编写的string3)的读取过程?这是一个术语的问题,而不是功能的问题,特别是因为您在Linux上工作(如果是Windows,则会有更多讨论)。文本文件不包含空字节。如果您将包含空字节的文件称为“文本文件”,也就是说,按照大多数标准,这是一个误称——它是一个二进制文件,而不是文本文件。然而,正如我所说,这是一个术语问题,而不是实现问题。您应该对系统调用的所有返回值进行处理。检查它们是否符合您的期望。例如,
fread
返回什么?