Почему этот цикл не печатает одно и то же значение непрерывно? - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь понять некоторый C-код, с которым я столкнулся.Для записи, код делает именно то, что должен, за исключением строки печати, которую я добавил.Он берет все содержимое из inputFile.txt, заменяет J на ​​X и записывает его в outputFile.txt.

int main(void) {
    int fd_to_read = open("inputFile.txt", O_RDONLY);
    int fd_to_write = open("outputFile.txt", O_WRONLY | O_CREAT);

    char c;
    int bytes;
    while ((bytes = read(fd_to_read, &c, sizeof(c))) > 0) {
        if (c == 'J') {
            c = 'X';
        }
        write(fd_to_write, &c, sizeof(c));
        //I added this and it doesn't work.
        printf(&c);
    }
    close(fd_to_read);
}

Когда я впервые увидел это, я ожидал, что цикл while будет печататьпервый символ из файла снова и снова.Я понимаю, что функция read() будет выполняться до тех пор, пока она не станет >0, но я предположил, что для того, чтобы изменить позицию в файле, адрес памяти, на который указывает c, должен был бы быть увеличен на что-то, возможно,sizeof(c), но ничего не увеличивается, а просто переходит к следующей букве в файле.Мое следующее предположение заключается в том, что read() обрабатывает это самостоятельно, но когда я пошел печатать содержимое &c, я приблизился к тому, что ожидал, что представляло собой тонну мусора, поскольку он просто печатал случайные вещи из памятипо существу.

Итак, два вопроса на самом деле.

  1. Как &c, записываемый в outputFile.txt, записывает в него корректно, не увеличивая адрес c?

  2. Как бы я просто напечатал отдельные символы из файла без всякой фигни, так как print(&c) добавил всю фигню после каждого символа?

Ответы [ 2 ]

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

Хорошо, две вещи.

(1) char c не нужно увеличивать, потому что он работает как вывод до read fn.

(2) read и write fn автоматически увеличивают свои соответствующие файловые дескрипторы.

Файловые дескрипторы (fd_to_read, fd_to_write) представляют местоположение в файле, а не char c.

Readоб этом в справочных страницах: https://linux.die.net/man/3/read https://linux.die.net/man/3/write

0 голосов
/ 28 сентября 2019

char c; ... printf(&c); - UB, но я подозреваю, что OP знает это.

Первый аргумент printf() должен быть указателем на строку .&c не является указателем на строку .

ОП надеется на благоприятный UB.Удачи.

...