在c中使用lseek命令查找文件中的字符串



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

id(space)name(space)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("%sn",line);
}
lseek(fd, 1 ,SEEK_CUR);
}
close(fd);

为任务使用正确的工具。钉子用锤子,螺丝用螺丝刀

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

问问自己,

你的任务是什么:

  • 查找特定id
  • 打印匹配
  • 的行

你有什么:

  • 一个固定格式的数据集(textfile) (id)空间& lt;比;<<strong>名称/strong>空间& lt;比;<<strong>地址/strong>& lt;换行符祝辞)

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

正确的过程是:

  • 读取整行(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;
}

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

如果你有一个四行,其中的名字使字符的数量不同,它们应该被附加到文件中,而不需要任何其他结构。

行由n字符分隔,这些字符可以出现在任何位置,因此第二行从n字符第一次出现的后面开始。

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

您需要一个索引,它是一个文件,允许您在固定长度的记录上获取,以存储数据文件中每行的起始位置。通过这种方式,要读取行i,需要访问位置(record_index_size * i)的索引,并获得行i的起点位置。然后转到数据文件,将文件指针定位到最后一次计算得到的值,并使用例如fgets(3)读取该值。

为了建立索引,你需要在每次调用fgets()之前调用ftell(),因为调用fgets()会移动指针,所以得到的位置是不正确的。试着用固定长度的格式写位置,例如二进制格式,使用:

write(ix_fd, position, sizeof position);

因此i行的位置可以通过读取i * sizeof position位置的索引来计算。