2012-04-13 2 views
4

텍스트 파일의 문자를 '?'로 바꿔야합니다. 예상대로 작동하지 않습니다.C, unix 및 write(), open() 및 lseek()로 char 덮어 쓰기

파일의 내용이 'abc'(따옴표 제외)이고 unix 시스템 호출 : lseek(), open() 및 write()를 사용해야합니다. 표준 C 파일 I/O 기능을 사용할 수 없습니다.

좀 더 일반화 된 "찾기 및 바꾸기"유틸리티로 결국이 문제를 내놓을 계획입니다.

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(){ 

int file = open("data", O_RDWR); //open file with contents 'abc' 
lseek(file,0,0); //positions at first char at beginnging of file. 
char buffer; 
read(file,&buffer, sizeof(buffer)); 
printf("%c\n", buffer); // text file containing 'abc', it prints 'a'. 

if (buffer == 'a'){ 
    char copy = '?'; 
    write(file,&copy,1); //text file containing 'abc' puts '?' were 'b' is. 
    } 

close(file); 
} 

파일 "데이터는"ABC, 내가 을 대체 할 포함? 및 확인이 ? BC하지만 난 오른쪽 문자를 읽고()

읽기 c를? 받고 있어요,하지만 쓰기() 다음 문자로 쓰고있다. 이유가 무엇인가요?

몇 시간 동안 google을 검색했습니다.

감사합니다.

+0

쓴 맛을 경험하고, 반갑지 않은 코드를 찾는 것이 짜증나게됩니다 (아무도 작업 코드에 도움이 필요하지 않습니까?).그래서 : if ** if (buffer == 'a') ** put ** lseek (file, -1, 1); ** 그리고 작동합니다. – Pygar

답변

5

실제로 답변은 사용자의 코드에 포함되어 있습니다.

이 바로 뒤에 오는 호출은 open이 필요하지 않습니다. 처음으로 open 파일의 현재 탐색 오프셋이 0이기 때문입니다.

각 성공적인 read 또는 write 작업 후에는 검색 오프셋이 읽기/쓰기 바이트 수만큼 앞으로 이동합니다. (당신이 오프셋을 추구하여 open-O_APPEND를 추가하는 경우 또한 현재 - 파일의 마지막에, 단지 각 쓰기 전에 이동하지만이 시점에서 관련 없습니다.)

성공적 read 한 바이트 이후, seek offset은 0에서 1로 이동합니다. 다시 0으로 되돌리려면 수동으로해야합니다.

(당신은 또한 각 작업이 실제로 물론, 성공할 확인해야합니다,하지만 난 당신이 여기에 간결하게 그 왼쪽으로 가정한다.)

0

전화를 읽고() 앞으로 한 바이트 파일 포인터를 이동 -에서 즉, 0에서 1까지. 읽기 및 쓰기에 동일한 파일 설명자 ("int file = ...")를 사용하기 때문에 위치는 읽기 및 쓰기와 동일합니다.

방금 ​​읽은 바이트 이상 작성하려면

(buffer == 'a') 

사실이 온다 후 다시 한 바이트) (lseek의 할 필요가있다.

0

lseek의 위치가 잘못되었습니다. 'a'가 발견되면 'a'라고 쓰여집니다. 다음 사용 가능한 지점에서 ('b'를 덮어 쓰게됩니다). 수정하기 전에, 쓰기 전에 lseek를 사용하여 현재 위치를 변경해야합니다.

if (buffer == 'a'){ 
char copy = '?'; 
lseek(file,0,SEEK_SET); //positions at first char at beginnging of file. 
write(file,&copy,1); //text file containing 'abc' puts '?' were 'b' is. 
}