我试图读取一个文件与1024行,每行9次相同的字母和返回,如果它发现一行不符合这个条款。C函数读取(文件,缓冲区,字节读取)打破一个字符串
的文件是如下但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)中给出了这个输出,并且该行对于最后用\ n书写了9次的字母是正确的。
任何想法,为什么会发生这种情况?如果我不使用lseek它可以正常工作,但我需要lseek将文件分成若干部分,以便通过不同的线程进行测试。我把lseek中的0索引简化为向你们展示。
谢谢。
如果你正在尝试使用'与fgets(读取由行的文本文件行倒不如让库函数做的工作适合你)'或'fscanf()'。而不是使用'fseek()',每个线程可以在它感兴趣的人之前简单地丢弃任何行。另一条路线可以是将整个10k文件(它不是很大,并且你知道它的大小)读入所有可用的静态存储器线程,让他们都检查相同的副本。 – 2014-11-14 18:18:42
当您从中读取文件时,您的其他线程之一是否正在对您的文件执行lseek?你应该把'lseek'移到你锁定文件的地方。这样,一旦你锁定了,你就只能'查看'。 – JS1 2014-11-14 18:20:20
问题是,由于我已经有了使用线程读取整个文件的其他程序,因此这个新程序需要共享相同的文件才能更快地进行测试,而且我的老师说它必须使用lseek()和read()。我不明白它是如何工作的大部分线路,只是在特定的路线失败。没有意义。 – 2014-11-14 18:27:10