C - 打破字符串的函数读取(文件,缓冲区,要读取的字节)

时间:2014-11-14 18:07:38

标签: c pthreads lseek

我尝试读取一行包含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中给你们看。

感谢。

2 个答案:

答案 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()
相关问题