1

我正在尝试读取文件并将每一行放入共享内存(是的,我知道这不是最实用的方法,但可以说我必须使用共享内存)。是否可以将这些行读入共享内存,以便我可以快速跳转到共享内存中的某一行?

例如,如果我的文件是:

ABCD 
EFGH 
IJKL 

我可以直接跳到共享内存中的第 3 行以便得到“IJKL”吗?

我目前正在像这样将它读入内存:

    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_sizeline_count您将分配一个大小为大小的共享内存空间,file_size + line_count + (line_count + 1) * sizeof(char *)以存储我们需要共享的所有信息。

声明一个变量char **index并将其设置为index = (char **)shm定义共享内存块的开头是我们的行索引所在的位置,并设置index[line_count] = NULL以便您稍后知道何时index[n]返回 NULL ,因为您已到达其末尾。

声明一个变量char *buffer并将其设置为buffer = (char *)(&index[line_count+1])所以现在我们已经buffer指向你的内存块中的点,就在index结束的地方。它是你要存储行的地方。

现在阅读这样的行:

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

一旦完成读取文件,您就可以将其全部组织在index. 第一行是index[0],第二行是 ,index[1]依此类推。所有行都是分开的并以空值结尾。

于 2013-03-08T22:31:50.633 回答