簡體   English   中英

有沒有辦法在linux中創建虛擬文件描述符?

[英]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

祝好運!

這些鏈接也可能會有所幫助:

char vs wchar_t

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

如果需要,可以通過fdopen()調用將文件描述符轉換為文件指針。

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

如果要刪除磁盤上文件的前40個字節而不創建另一個文件,則可以將第41個字節中的內容復制到緩沖區中,然后將其寫回offset -40。 然后使用ftruncateunistd.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM