我尝试读取一行包含1024行,每行9次相同字母的文件,如果找到的行不符合此条款,则返回。
该文件如下,但有1024行:
eeeeeeeee
eeeeeeeee
eeeeeeeee
代码:
fd = open(fileName, O_RDONLY);
lseek(fd,0,SEEK_SET);
if(flock(fd, LOCK_SH) == -1)
perror("error on file lock");
if(fd != 0){
read(fd, lineFromFile, (sizeof(char)*10));
arguments->charRead = lineFromFile[0];
for(i=0; i < 1024; i++){
var = read(fd, toReadFromFile, (sizeof(char)*10));
if(strncmp(toReadFromFile,lineFromFile,10) != 0 || var < 10){
arguments->result = -1;
printf("%s \n\n",toReadFromFile);
printf("%s \n",lineFromFile);
printf("i %d var %d \n",i,var);
free(toReadFromFile);
free(lineFromFile);
return ;
}
}
}
输出:
> eeeee
eeee
eeeee
eeee
i 954 var 6
我有5个不同的文件和不同的字母,每一个都在该特定行(954)中给出了这个输出,并且该行是正确的,字母写了9次,最后是\ n。
为什么会发生这种情况的任何想法?如果我不使用lseek它工作正常但我需要lseek将文件分成几个部分以供不同线程测试。为了简化,我把0索引放在lseek中给你们看。
感谢。
答案 0 :(得分:1)
看起来您正在寻找"eeeee\neeee"
而不是"eeeeeeeee\n"
。这意味着你的文件应该像这样开始:
eeeee
eeeeeeeee
eeeeeeeee
并以此结束:
eeeeeeeee
eeee
如果您的文件以这样结束:
eeeeeeeee
eeeeeeeee
然后当你到达最后一行时,它会失败,因为你只会阅读"eeeee\n"
而不是"eeeee\neeee"
。
鉴于您评论中的新信息,我认为问题在于您不应该寻求中间线(在本例中为342和684)。你应该寻求预期字符串的偶数倍(如340和680)。此外,第954行不是问题发生的地方。它应该是954 + X行,其中X是你寻找的行。
答案 1 :(得分:1)
无论你的程序有什么其他问题,它当然都有:read()
函数不能保证读取所请求的完整字节数。除非遇到错误或文件末尾,否则它将至少读取一个,并且在许多情况下它会读取所请求的完整字节数,但即使在文件结束前剩余足够的字节,{{1可以读取比请求的更少的字节。
要求您使用更高级别功能的注释要经过深思熟虑,但如果由于某种原因您有义务使用read()
,则必须注意读取的字节数少于请求的情况,并处理它们通过将额外的字节读入缓冲区的未使用的尾端。可能是多次。
在函数形式中,可能如下所示:
read()