Как заменить последовательные вхождения символов в файле номером - PullRequest
0 голосов
/ 22 сентября 2019

В моем коде я успешно открыл файл, но теперь я не понимаю, как выполнить цикл, используя функцию read (), чтобы получить все символы в file1.Я установил буфер размером 8, но содержимое файла больше.

Спасибо.Также, пожалуйста, помогите мне сделать это, используя syscalls как этот

1 Ответ

1 голос
/ 22 сентября 2019

Вы путаетесь между 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) проверяется на нулевое значение.

...