0

私はシステムコールに非常に慣れていません。インデックスは使えると思いますが、どうやって実装すればいいのかよくわかりません。すべての「:」と「>」のデータを含むファイルを検索するとします。

たとえば、次のmyfile.txtがあります。

こんにちは:これは(1=ゼロi>10)のテストです。この行には:と>の両方が含まれているため、この行は2つのファイルに書き込む必要があります。

したがって、書き込み用に2つのファイルを開き、読み取り用に1つのファイル(myfile.txt)を開き、「:」を含む行を見つけたら、それをcolon.txtファイルに書き込みます。行に「>」文字が含まれている場合は、greaterthen.txtファイルに書き込みます。

その他のコメント:はい、バッファを実装する必要があります。

4

1 に答える 1

1

すみません、質問を読み違えました。

いろいろ検討する必要が出てきます。はい、バッファが必要ですが、行がバッファよりも大きい場合はハンドルもあります。したがって、2 つのバッファーが必要です。1 つは読み取り用で、もう 1 つは行全体を組み立てるためです。1 つのバッファで実行することは可能ですが、非常に複雑に思えました。

私のCはかなり錆びていますが、これはうまくいくようです。エラー処理が必要であり、あなたのコーディング スタイルとは一致しないと確信していますが、一度行ったテストはうまくいったようです。読み取りバッファーが異常に小さいのは、1 行がバッファーよりも大きい状況を示すためです。実際には、読み取りバッファーははるかに大きくなります。

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int findchar(char*, int, char);

int main()
{
    size_t dataIn = open("myfile.txt", O_RDONLY);
    size_t gtOut = open("greaterthan.txt", O_CREAT | O_WRONLY);
    size_t coOut = open("colon.txt", O_CREAT | O_WRONLY);

    char buffer[12];
    int iReadCnt;
    char* lineBuffer = NULL;
    int lineBufferSize = 0;

    // read input file until no more input
    while (iReadCnt = read(dataIn, buffer, sizeof(buffer)))
    {
        int x;
        int n;
        char* b;

        // add buffer to dynamic line buffer
        n = lineBufferSize + iReadCnt;
        b = malloc(n);
        memcpy(b, lineBuffer, lineBufferSize);
        memcpy(&b[lineBufferSize], buffer, iReadCnt);
        // free old buffer if exists
        if (lineBuffer)
        {
            free(lineBuffer);
        }

        lineBufferSize = n;
        lineBuffer = b;

        // look for end of line
        x = findchar(lineBuffer, lineBufferSize, '\n');

        if (x >= 0)
        {
            int gtPos;
            int coPos;
            int n;
            char* b;

            // look for gt
            gtPos = findchar(lineBuffer, x, '>');

            if (gtPos >= 0)
            {
                write(gtOut, lineBuffer, x + 1);
            }

            // look for colon
            coPos = findchar(lineBuffer, x, ':');

            if (coPos >= 0)
            {
                write(coOut, lineBuffer, x + 1);
            }

            // remove line from buffer
            n = lineBufferSize - (x + 1);
            b = malloc(n);
            memcpy(b, &lineBuffer[x + 1], n);
            free(lineBuffer);
            lineBufferSize = n;
            lineBuffer = b;
        }
    }

    // close files
    close(dataIn);
    close(gtOut);
    close(coOut);
    exit(0);
}

// simple function to find a character in a buffer
int findchar(char* buffer, int len, char c)
{
    int i;
    for (i = 0; i < len; ++i)
    {
        if (buffer[i] == c)
        {
            return i;
        }
    }

    return -1;
}
于 2012-04-12T04:11:45.217 に答える