Как поменять букву в файле с буфером и 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 ответа
printf("%s\n", buf);
это UB.%s
хочетNULL
завершенная строка.Use printf("%c\n", buf[0])
;if(buf == 'a')
должно бытьif(buf[0] == 'a')
, Вы сравниваете адресbuf
с'a'
char, но вы хотите сравнить содержимое первой (уникальной) ячейкиbuf
массив.
buf
указатель, содержащий адрес Итак, состояние
if(buf=='a')
становится false
и не входит в if
блок.
Попробуйте использовать
if(*buf=='a')
ИЛИ ЖЕ if(buf[0]=='a')