1

ファイルを読み取って各行を共有メモリに入れようとしています (はい、これが最も実用的な方法ではないことはわかっていますが、共有メモリを使用する必要があるとだけ言っておきましょう)。共有メモリ内の特定の行にすばやくジャンプできるように、これらの行を共有メモリに読み込むことはできますか?

たとえば、私のファイルが次の場合:

ABCD 
EFGH 
IJKL 

「IJKL」を取得するために、共有メモリの 3 行目に直接ジャンプできますか?

現在、次のようにメモリに読み込んでいます。

    key_t key; /* key to be passed to shmget() */ 
    int shmflg; /* shmflg to be passed to shmget() */ 
    int shmid; /* return value from shmget() */ 
    int size; /* size to be passed to shmget() */ 
    char *shm, *s;

// we'll name our shared memory segment: 1234
    key = 1234;
     if((shmid = shmget(key,size, S_IRUSR | S_IWUSR)) < 0){
        perror("shmget failed");
        exit(1);
    }

    // attach the segment to our data space
    if((shm = shmat(shmid, NULL, 0)) == (char*) -1){              
        perror("shmat failed");
        exit(1);
        }
    s = shm;

    // note: line is a character array that's large enough to include the whole file
    while(fgets(line, 128, fp) != NULL){            
    // try putting the line into our shared memory:
    sprintf(s, line);
    }           
4

1 に答える 1

2

それを行うにはいくつかの方法があります。文字列のキューまたは配列を使用できます。文字列の配列を使用してそれを行う方法を説明します。これは、より単純な概念である可能性があるためです。

まず、ファイルのサイズとファイルの行数が必要です。その方法を理解するのはあなたに任せます。

file_sizeとをline_count並べ替えたら、共有する必要のあるすべての情報を保存するために、サイズの共有メモリスペースを割り当てますfile_size + line_count + (line_count + 1) * sizeof(char *)

char **index変数を宣言しindex = (char **)shm、共有メモリブロックの先頭が行インデックスの場所になるように設定し、最後に到達したためindex[line_count] = NULLに後でNULLが返されるときにわかるように設定します。index[n]

変数を宣言してchar *bufferに設定すると、メモリブロック内の終了直後のスポットを指すようになりbuffer = (char *)(&index[line_count+1])ます。線を保存する場所です。bufferindex

次のような行を読んでください。

int i = 0;
while(!feof(fp)) {
    index[i++] = buffer;
    fgets(buffer, file_size, fp);
    buffer += strlen(buffer) +1;
}

ファイルの読み取りが完了すると、すべてがで整理されますindex。最初の行はindex[0]、2番目の行はというindex[1]ように続きます。すべての行は分離され、nullで終了します。

于 2013-03-08T22:31:50.633 に答える