0

我有一个按以下顺序存储学生数据的文件:

id(空格) name(空格)address

以下是该文件的内容:

10 john manchester

11 sam springfield

12 samuel glasgow

每个数据都存储在换行符中。

我想用id10 搜索学生并使用命令显示他/她的详细信息lseek,但我不会完成任务。任何帮助表示赞赏。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void main() {

char line[50] = "";

char id[2] = "";

ssize_t fd = open("file.dat", O_RDONLY);

while(read(fd,line,sizeof(line))>0){

if (id[0] == '1' && id[1] == '0'){
    printf("%s\n",line);
}
lseek(fd, 1 ,SEEK_CUR);
}
close(fd);
4

2 回答 2

1

使用正确的工具来完成任务。钉子锤,螺丝起子。

lseek在这里不是正确的工具,因为lseek用于重新定位文件偏移量(您还没有,您正在寻找特定位置,当找到时,您不需要重新定位文件偏移量,因为您是已经在那了)。

问你自己,

你的任务是什么:

  • 搜索特定的 id
  • 如果匹配则打印该行

你有什么:

  • 具有固定格式的数据集(文本文件)(id <空格>名称<空格>地址<换行符>)

您的数据集由换行符分隔,id 是该行的第一个字段。这里的关键字是“换行符”和“第一个字段”。

这里的正确程序是:

  • 读一整行 ( fgets)
  • 将第一个字段(行首)与所需的 id ( strcmp)进行比较

示例

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

int main() {
    //return value of main
    int ret = EXIT_FAILURE;

    //open filestream in read mode
    FILE *f = fopen("file.dat", "r");

    //string buffer
    #define MAX_LEN 50
    const char line[MAX_LEN];
    char field[MAX_LEN];

    //the id to search for
    const char *id = "10";

    //for each line
    while (fgets(line, MAX_LEN, f)) {
        //extract the first field ('%s' matches a sequence of non-white-space characters)
        sscanf(line, "%s", field);
        //compare the field with the desired id
        if (strcmp(field, id) == 0) {
            //if found print line
            printf("%s", str);
            //set result to success
            ret = EXIT_SUCCESS;
            //and exit
            break;
        }
    }

    //cleanup
    fclose(f);

    //return the result
    return ret;
}
于 2021-02-15T14:09:11.783 回答
0

您的文件的第一行包含 18 个字符,第二行包含相同数量的字符,第三行包含少一 (17) 个字符。

如果您有四行,例如名称使字符数不同,则应将它们附加到文件中而无需任何其他结构。

行由可以出现在任何点的字符分隔\n,因此第二行在字符的第一次出现之后立即开始\n

出于这个原因,您不知道每行开始的确切位置,因此您无法知道每行开始的确切位置,因为每行的位置是(n + 1)从前一行开始的位置向前的字节,数字在n哪里您在前一行中输入的字符数加上一个(用于新行字符)。

您需要一个索引,这是一个允许您在固定长度记录上获取存储数据文件中每一行的起始位置的文件。这样,要读取 line i,您访问 position 处的索引(record_index_size * i),并获取 line 起点的位置i。然后您转到数据文件,并将文件指针定位到从 las 计算中获得的值,并使用例如fgets(3).

要建立索引,您需要ftell()在每次调用 之前调用fgets(),因为调用fgets()会移动指针,因此获得的位置将不正确。尝试以固定长度格式(例如二进制形式)写入位置,其中:

    write(ix_fd, position, sizeof position);

所以线的位置i,可以通过读取位置处的索引来计算i * sizeof position

于 2021-02-16T18:52:40.873 回答