Вы путаетесь между char
и указателем на char
:
char *buffer[4096];
Массив указателей на символы, который должен содержать указатели, а не chars
.Вам нужен массив char
:
char buffer[4096];
Теперь, когда вы добавите \0
, вы получите ошибку компилятора.Это также означает, что она содержит строку, то есть вы используете %s
преобразование для printf
, чтобы напечатать ее, без зацикливания, просто выполните:
printf("%s", buffer);
Также сделайте ваш read
следующим образом(опять же, цикл не нужен):
ssize_t count = read(fd1, buffer, sizeof buffer - 1);
if(count < 0)
return -1;
Это будет считывать до 4095 байтов в ваш массив, в зависимости от размера файла.Это оставляет место для вашего \0
.
Поэтому, чтобы убедиться, что вы прочитали все свои файлы, сделайте что-то вроде:
ssize_t count;
while((count = read(fd1, buffer, sizeof buffer - 1)) != 0)
{
if(count < 0)
return -1;
buffer[count] = '\0';
printf("%s", buffer);
// Do your processing here
}
Идея состоит в том, чтобы прочитать фрагмент из файла, а затемобработайте его по мере необходимости, затем прочитайте другой фрагмент и т. д. Когда будет достигнут конец файла, read
вернет 0
и ваша обработка остановится.
Эквивалентный способ выполнить этот цикл, который можетпроще понять это:
ssize_t count = read(fd1, buffer, sizeof buffer - 1);
while(count != 0)
{
// .....
count = read(fd1, buffer, sizeof buffer - 1);
}
Это делает более понятным, что вы зацикливаетесь, пока count
не станет нулевым.Хитрость, которую я использовал, заключается в том, чтобы взять часть count = read(...)
и поместить ее в скобки.Результат оценки того, что находится внутри скобок (count = read(...))
, является результатом присваивания (то есть того, что присваивается count
, что является результатом read
).Помещение в оператор while
означает, что часть в круглых скобках вычисляется первой (т. Е. Она выполняет read
и присваивает count
).Затем результат присваивания (т. Е. count
) проверяется на нулевое значение.