6

次の方法で1つのファイルを開きました:

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

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

したがって、ファイルを指す別のダミー FILE ポインターを作成し、このダミー ポインターを次の操作を行う別の関数に渡すと、次のようになります。

  fseek ( dummy file pointer , 0 , SEEK_SET );

次に、some.txt の 40 番目の位置にファイル ポインターを設定する必要があります。


ただし、関数はファイル記述子を受け入れるため、最初の 40 バイトがファイルに含まれていないため、ファイルを処理するファイル記述子を渡す必要があります。


要するに、そのダミー記述子は、それらの 40 バイトがそのファイルになかったため、ファイルを処理する必要があり、すべての位置決め操作は、最初のバイトとしてカウントされるその 40 番目のバイトに関して行う必要があります。

4

5 に答える 5

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とwchar_t

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

必要に応じて、fdopen()呼び出しを介してファイル記述子をファイルポインタに変換できます。

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

于 2012-06-15T04:56:20.147 に答える
2

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

于 2012-06-15T04:56:37.577 に答える
2

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

つまり、ダミーポインタはファイルをそのファイルに40バイトがないものとして扱い、すべての位置はその40バイトを基準にして1バイトとしてカウントする必要があります。

要件が競合しているため、CAPIを使用してこれを行うことはできません。

SEEK_SETは常にファイル内の絶対位置を参照します。つまり、そのコマンドを機能させるには、ファイルを変更してジャンクを削除する必要があります。

Linuxでは、40バイト目から始まるようにファイルを表示するFUSEドライバーを作成できますが、それは大変な作業です。あなたが作成した問題を解決することが可能であるため、これについてのみ言及しますが、実際にこれを行うのは非常にばかげています。

もちろん、最も簡単なことは、探しているこのエミュレートレイヤーのアイデアを放棄し、その余分なヘッダージャンクを処理できるコードを作成することです。

于 2012-06-15T05:17:53.303 に答える
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バイトからファイルを読み取っています。これはあなたが期待していることですか、それとも何か他のものですか?

于 2012-06-15T04:53:01.237 に答える
1

mmap私は実際にこれを試したことはありませんが、( MAP_SHARED オプションを使用して)使用して、ファイルをアドレス空間にマップし、そのバッファーの最初の 40 バイトを除くすべてを参照するfmemopenを取得できるはずだと思いますFILE*.

これによりFILE*(質問の本文で説明したように)が得られますが、ファイル記述子(タイトルや質問の他の場所のように)ではないと思います。FILE*2つは同じではなく、作成されたAFAIKにはfmemopen関連付けられたファイル記述子がありません。

于 2012-06-15T09:05:15.537 に答える