C - Функция чтения (файл, буфер, байты для чтения) разрыв строки
Я пытаюсь прочитать файл с 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 ответа
Похоже, вы ищете "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;
}