2012-06-15 26 views
6

は、私は次のように一つのファイルを開いている:linuxにダミーファイルディスクリプタを作成する方法はありますか?

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

を今、このファイルには、いくつかのバイトが、私はそれらを削除したいので、40バイトのデータの不要なジャンクであると言うことができます第一に。しかし、そのファイルからそのデータを削除することはできません。または、 その不要なデータなしでそのファイルの複製を作成することはできません。

だから私は、ファイルを指す別のダミーファイルポインタを作成したいと私は、次の操作を行い任意の別の関数にこのダミーのポインタを渡すとき:

fseek (dummy file pointer , 0 , SEEK_SET); 

それは時にファイルポインタを設定する必要があります私のsome.txtの40位。


しかし、私はそれらの最初の40のバイトがファイルに決してなかったとしてファイルを扱いますファイル記述子を渡す必要があるので、関数は、ファイルディスクリプタを受け付けます。要するに


それらの40のバイトは、そのファイルではありませんでしたし、第1バイトであるように、すべての位置決め操作はその第40バイトカウントに対するあるべきなダミー記述子には、ファイルを扱う必要があること。

+0

下記の更新された投稿を確認してください。 – DevNull

+0

あなたは何をしたいのか再度説明できますか?あなたの編集は本当に混乱しますね。 –

答えて

2

fseek(ダミーファイルポインタ、0、SEEK_SET);

つまり、ダミーポインタはファイルを処理する必要があります。そのファイルにはその40バイトが存在しないため、すべての位置は1バイト目と同様に40番目のバイトを基準にする必要があります。

要件が矛盾しているため、C APIでこれを行うことはできません。

SEEK_SETは常にファイル内の絶対位置を表します。つまり、このコマンドを機能させるには、ファイルを修正して迷惑メールを削除する必要があります。

Linuxの場合、ファイルは40バイト目から開始しているようなFUSEドライバを書くことができますが、それはの多くのファイルでです。私はの可能性がありますのでという問題を解決するためにはが可能ですが、これは実際にこれを行うには非常に愚かです。

もっとも簡単なことは、あなたが探しているこのエミュレーションレイヤのアイデアを放棄し、余分なヘッダジャンクを処理できるコードを書くことだけです。

+0

あなたは正しいようです。 Linuxでこのようなダミーのファイル記述子を作成するために私は自分のドライバを書く必要があります。他の方法で私はfdのプロパティを完全に私の要件をchengeすることはできませんので、今私はその40バイトのジャンクを処理するために考える必要があります! –

+0

fopencookie()を使用することはできませんし、カスタムフック関数ですべてのものを正確に処理できますか? – Collin

+0

申し訳ありませんが、心配しないでください。これは非標準のGNU拡張です。 – Collin

1

私はあなたの質問から理解したもので小さなコードを書いた。

#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バイトからファイルを読み取ります。 これはあなたが期待していることなのでしょうか?

+0

fseek(dfp、0、SEEK_SET); 私はそれがいつも0番ポジションに行くのではなく、40番ポジションチェックアウト... !!! –

+0

私はそれを試してみませんでした... – Raghuram

4

簡単。

#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に割り当てます。

幸運を祈る!

これらのリンクは、おそらく同様に役に立ちます。

char vs wchar_t

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

したい場合は、あなただけのfdopen()呼び出しを介してファイルポインタをファイルディスクリプタを変換することができます。

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

+1

あなたはOFFSETを使うことを忘れているようです。 –

+0

+1 +1;ありがとう。疲れた/遅い;いい視点ね; – DevNull

+1

が修正されましたが、new_fd = fileno(dummy); new_fdは元のファイルを扱っていたのでファイルを扱いませんか? –

2

あなたは、あなたが第41バイトからコンテンツをコピーして、以降のバッファにすることができ、別のファイルを作成することなく、ディスク上のファイルの最初の40のバイトを削除したい場合は、でそれを書き戻しますオフセット-40。次に、ftruncateunistd.hのPOSIXライブラリ)を使用して、(filesize-40)オフセットで切り捨てます。

1

すべてを指しFILE*を得るために、私は実際にこれを試していないが、私はあなたがあなたのファイルがあなたのアドレス空間にマッピングされた取得する(MAP_SHAREDオプションで)mmapを使用することができるはずだと思うし、その後fmemopenが、そのバッファの最初の40バイトこれはあなたに与え

FILE*(あなたは、あなたの質問の本文に記述したように)、私はない(タイトルで、他の場所の問題のように)ファイルディスクリプタを信じています。 2つは同じではなく、fmemopenで作成されたAFAIK FILE*には、関連するファイル記述子がありません。

関連する問題