[英]C - Function read(file,buffer,bytes to read) breaking a string
我正在尝试读取包含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中以示大家。
谢谢。
看起来您正在寻找"eeeee\\neeee"
而不是"eeeeeeeee\\n"
。 这意味着您的文件应该这样开始:
eeeee
eeeeeeeee
eeeeeeeee
像这样结束:
eeeeeeeee
eeee
如果文件以这种方式结束:
eeeeeeeee
eeeeeeeee
然后,当您到达最后一行时,它将失败,因为您只会读取"eeeee\\n"
而不是"eeeee\\neeee"
。
鉴于您评论中的新信息,我相信问题是您不应该寻求中间的问题(在本例中为342和684)。 您应该寻求预期字符串的偶数倍(例如340和680)。 同样,第954行也不是问题发生的地方。 它应该是954 + X行,其中X是您要搜索的行。
无论您的程序有任何其他问题,它肯定具有以下特点: read()
函数不能保证读取请求的全部字节数。 除非遇到错误或文件末尾,否则它将至少读取一个,并且在许多情况下,它会读取请求的全部字节数,但是即使文件末尾还有足够的字节数,也要read()
读取的字节可能少于请求的字节。
强烈建议您考虑使用更高级别的函数的注释,但是如果由于某种原因您不得不使用read()
则必须注意读取的字节数少于请求的字节数,并通过读取其他字节来处理它们进入缓冲区未使用的尾端。 可能多次。
在函数形式中,可能如下所示:
int read_all(int fd, char buf[], int num_to_read) {
int total_read = 0;
int n_read = 0;
while (total_read < num_to_read) {
n_read = read(fd, buf + total_read, num_to_read - total_read);
if (n_read > 0) {
total_read += n_read;
} else {
break;
}
}
return (n_read < 0) ? n_read : total_read;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.