Как поменять букву в файле с буфером и lseek

У меня возникли проблемы с использованием lseek и буфера для назначения. Цель состоит в том, чтобы прочитать файл и заменить каждую букву "а" на "?". Я запускаю некоторые второстепенные программы, чтобы понять, как работают функции и буфер, и у меня возникли некоторые проблемы. Представьте, что в моем файле "teste" есть только "abcabcabc". Если я сделаю это:

int fd = open("teste", O_RDWR);
char buf[1];
int fptr = lseek(fd, 0, SEEK_SET);
fflush(stdout);
read(fd, buf, 1);
printf("%s\n", buf);

я получаю на своей консоли "а", так что она хорошо читает первое письмо, потому что я положил указатель на начало. Но если я выполню условие if перед printf, сопоставим buf с 'a', например:

if(buf == 'a') printf("%s\n", buf);

Он не работает, ничего не печатает, поэтому он не вводит оператор if. Мне нужно сравнить буфер с буквами, чтобы я мог изменить все "а" файла. Как я могу это сделать? ребята?

Хорошо, эта часть уже решена из-за ответов ниже, но теперь я пытаюсь прочитать весь файл и сравнить каждый символ с 'a', делая простой printf просто чтобы посмотреть, работает ли он.. я написал это:

int fd = open("teste", O_RDWR);
char buf[1];
int fptr = lseek(fd, 1, SEEK_SET);
fflush(stdout);
read(fd, buf, 1);
while(fptr > 0){
  read(fd, buf, 1);
  if(buf[0] == 'a'){
    printf("%s\n",buf);
  }
  fflush(stdout);
  fptr=lseek(fd, (off_t)(1), SEEK_CUR);
}
close(fd);

Но теперь он работает... Он печатает только один 'а', а затем не закрывается и ничего не делает.. Это похоже на бесконечный цикл, но без ввода оператора if. В чем дело?

2 ответа

Решение
  1. printf("%s\n", buf); это UB. %s хочетNULL завершенная строка. Use printf("%c\n", buf[0]);
  2. if(buf == 'a') должно быть if(buf[0] == 'a'), Вы сравниваете адрес buf с 'a' char, но вы хотите сравнить содержимое первой (уникальной) ячейки buf массив.

buf указатель, содержащий адрес Итак, состояние

if(buf=='a')

становится false и не входит в if блок.
Попробуйте использовать

if(*buf=='a') ИЛИ ЖЕ if(buf[0]=='a')

Другие вопросы по тегам