有什么办法在linux中创build虚拟文件描述符?

我用下面的方法打开了一个文件

fp = fopen("some.txt","r"); 

现在在这个文件中的第一个字节可以说,40字节是不必要的垃圾数据,所以我想删除它们。 但我不能删除该文件中的数据,修改或创build该文件的重复,没有这些不必要的数据。

所以我想要创build另一个虚拟文件指针指向该文件,当我将这个虚拟指针传递给任何其他函数,执行以下操作:

  fseek ( dummy file pointer , 0 , SEEK_SET ); 

那么它应该将文件指针设置在我的some.txt中的第40个位置。


但函数接受一个文件描述符,所以我需要传递一个文件描述符,将文件视为那些前40个字节从来没有在文件中。


简而言之,虚拟描述符应该将文件视为那些不在该文件中的40个字节,并且所有定位操作都应该相对于作为第一字节计数的第40个字节。

fseek(虚拟文件指针,0,SEEK_SET);

总之,虚指针应该处理文件,因为在该文件中不存在那个40字节,并且所有位置都应该相对于第40个字节计数,因为它是第1字节。

你有相互矛盾的要求,你不能用C API做到这一点。

SEEK_SET总是指在文件中的绝对位置,这意味着如果你想要这个命令的工作,你必须修改文件,并删除垃圾。

在linux上,你可以编写一个FUSE驱动程序来显示这个文件,就像从第40个字节开始一样,但是这是很多的工作。 我只是提到了这个,因为可以解决你创建的问题,但实际上这样做会很愚蠢。

最简单的事情当然是放弃你正在寻找的这个模拟层的想法,并编写可以处理额外头垃圾的代码。

简单。

 #define CHAR_8_BIT (0) #define CHAR_16_BIT (1) #define BIT_WIDTH (CHAR_8_BIT) #define OFFSET (40) FILE* fp = fopen("some.txt","r"); FILE* dummy = NULL; #if (BIT_WIDTH == CHAR_8_BIT) dummy = fseek (fp, OFFSET*sizeof(char), SEEK_SET); #else dummy = fseek (fp, OFFSET*sizeof(wchar_t), SEEK_SET); #endif 

SEEK_SET宏指示文件的起始位置,根据您使用的是8位字符(ASCI)还是16位字符(例如:UNICODE),您将从文件指针的起始位置前进40个字符,并将该指针/地址到dummy

祝你好运!

这些链接也可能会有所帮助:

字符与wchar_t

http://www.cplusplus.com/reference/clibrary/cstdio/fseek/

如果你愿意,你可以通过fdopen()调用将文件描述符转换为文件指针。

http://linux.die.net/man/3/fdopen

如果要删除磁盘上文件的前40个字节而不创建另一个文件,则可以将第41个字节以后的内容复制到缓冲区中,然后将其写回到偏移量为-40的位置。 然后使用ftruncateunistd.h的POSIX库)在(filesize – 40)偏移处截断。

我用你的问题了解了一些小代码。

 #include<stdio.h> void readIt(FILE *afp) { char mystr[100]; while ( fgets (mystr , 100 , afp) != NULL ) puts (mystr); } int main() { FILE * dfp = NULL; FILE * fp = fopen("h4.sql","r"); if(fp != NULL) { fseek(fp,10,SEEK_SET); dfp = fp; readIt(dfp); fclose(fp); } } 

readIt()从11字节读取文件。 这是你所期待的还是别的什么?

我没有真的尝试过,但我认为你应该可以使用mmap (使用MAP_SHARED选项)来将你的文件映射到你的地址空间,然后用fmemopen来获得一个除了前40该缓冲区的字节。

这给了你一个FILE* (正如你在问题中所描述的那样),但是我相信一个文件描述符(就像在标题和问题的其他地方一样)。 这两个不一样,AFAIK用fmemopen创建的FILE*没有关联的文件描述符。