Нет, вам не нужно добавлять его вообще. Смещение первого символа в файле равно 0.
Смещение, если первый символ во второй строке равен 33 (при условии, что ваше окончание строки действительно равно перевод строки, а не комбо CR / LF).
Первый символ в третьей строке по смещению 66.
Итак, ваш код должен быть:
int bytes = 33 * c;
fseek (fp, bytes, SEEK_SET); // no "+1" here.
char test[34];
printf ("HERE: '%s'", fgets(test, 34, fp));
Вот расшифровка, показывающая это в действии:
pax$ cat qq.in
00010110001001000110011001000111
01011000011100001010100001001000
11110001011010000010010101111010
00000000000000000000000000000000
11110000111100001111000011110000
pax$ cat qq.c
#include <stdio.h>
int main (void) {
char test[34];
int c = 4;
FILE *fp = fopen ("qq.in", "r");
int bytes = 33 * c;
fseek (fp, bytes, SEEK_SET);
printf("HERE: %s", fgets(test, 34, fp));
fclose (fp);
return 0;
}
pax$ gcc -o qq qq.c ; ./qq
HERE: 11110000111100001111000011110000
Попробуйте этот код в своей среде и посмотрите, что произойдет. Если вы не получили правильные данные, значит, между вашим кодом и вашим входным файлом есть несоответствие.
Вы не указали, на какой платформе вы находитесь, поэтому может быть в том, что у вас на самом деле \r\n
в конце строк, а не просто \n
. Вы также можете открывать его в неправильном режиме (хотя это обычно имеет значение только в Windows).
Хорошая идея - создать дамп файла для проверки его содержимого. Например, в UNIXy системе:
pax$ od -xcb qq.in
0000000 3030 3130 3130 3031 3030 3031 3130 3030
0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0
060 060 060 061 060 061 061 060 060 060 061 060 060 061 060 060
0000020 3130 3031 3130 3031 3130 3030 3130 3131
0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1
060 061 061 060 060 061 061 060 060 061 060 060 060 061 061 061
0000040 300a 3031 3131 3030 3030 3131 3031 3030
\n 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0
012 060 061 060 061 061 060 060 060 060 061 061 061 060 060 060
:
<< Unnecessary Detail Removed >>
:
0000240 3030 3030 000a
0 0 0 0 \n
060 060 060 060 012
0000245
Кроме того, вы можете распечатать значения c
и bytes
перед их использованием. Функция fgets
будет возвращать NULL только в случае ошибки или если вы достигнете EOF до того, как прочитаны какие-либо данные.
Итак, если вы получаете NULL в качестве возвращаемого значения, либо вы искали за пределами файла (вероятно), либо вы столкнулись с ошибкой (несколько менее вероятно, но не невозможно).