[英]Is there any way to create dummy file descriptor in linux?
我用以下方式打開了一個文件:
fp = fopen("some.txt","r");
現在在這個文件中,第一個字節可以說40個字節是不必要的數據垃圾,所以我想刪除它們。 但我無法從該文件中刪除該數據,修改或創建該文件的副本而沒有那些不必要的數據。
所以我想創建另一個指向文件的虛擬FILE指針,當我將這個虛擬指針傳遞給執行以下操作的任何其他函數時:
fseek ( dummy file pointer , 0 , SEEK_SET );
然后它應該將文件指針設置在some.txt中的第40個位置。
但是該函數接受一個文件描述符,所以我需要傳遞一個文件描述符,它將文件視為文件中從未出現的前40個字節。
簡而言之,虛擬描述符應該將文件視為那個40字節不在該文件中,並且所有定位操作應該相對於第40個字節計數為第1個字節。
簡單。
#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個CHARACTERS,並指定該指針/地址到dummy
。
祝好運!
這些鏈接也可能會有所幫助:
http://www.cplusplus.com/reference/clibrary/cstdio/fseek/
如果需要,可以通過fdopen()調用將文件描述符轉換為文件指針。
如果要刪除磁盤上文件的前40個字節而不創建另一個文件,則可以將第41個字節中的內容復制到緩沖區中,然后將其寫回offset -40。 然后使用ftruncate
( unistd.h
的POSIX庫)截斷(filesize - 40)偏移量。
fseek(虛擬文件指針,0,SEEK_SET);
簡而言之,虛指針應該處理該文件,因為該文件中沒有那個40字節,並且所有位置都應該相對於第40個字節計數,因為它是第1個字節。
您的要求存在沖突,您無法使用C API執行此操作。
SEEK_SET始終引用文件中的絕對位置,這意味着如果您希望該命令起作用,則必須修改該文件並刪除垃圾。
在linux上,您可以編寫一個FUSE驅動程序,該文件將從第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
得到一個FILE*
引用除了前40個之外的所有FILE*
該緩沖區的字節數。
這給你一個FILE*
(正如你在問題正文中描述的那樣),但我認為不是文件描述符(如標題和問題的其他部分)。 兩者不一樣,用fmemopen
創建的AFAIK FILE*
沒有關聯的文件描述符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.