2012-03-03 2 views
2

내가 이런 파일 포인터가 말 :파일 스트림에 의해 뒤로 이동

file_ptr = fopen(“test.txt”, “r+”); 

을하고 내가 스트림을 통해 이동할 때 각 char의 ASCII 값을 변경하려면 (내가으로이 일을하고있다 암호, 그래서 더 나은 또는 더 효율적인 방법이 있다면 알려 주시기 바랍니다).

나는 fgetc()fputcwhile(!feof(file_ptr)) {} 루프를 사용하려고하지만, file_ptr 다음 문자를 가리키는 것, 그래서 내가 뒤로 한 자리 소수점을 할 수있는 일이 있는지 알고 싶습니다. 예

char* blah="blah blah"; 
char* index=blah; 
index++;/*how to navigate a file stream in this way*/ 
+0

'fseek (file_ptr, -1, SEEK_CUR); ' –

답변

5

:

는 기본적으로, 나는의 파일 스트림에 상응 알고 싶어 사용할 수를 the fseek function :

fseek(file_ptr, -1L, SEEK_CUR); // move backwards one character 

또한, 귀하의 fputc 후 당신의 fgetc 전에거야 fseek에게 다시 전화하기를 원합니다 :

fseek(file_ptr, 0L, SEEK_CUR); // don't move 

그냥 모든 버퍼 및 기타 등등을 제대로 플러시하는 것을 알고 있도록 읽기 및 쓰기간에 전환하는 시스템에 알리기 위해. (그렇지 않으면 당신은 실제로 당신이 생각하는 경우하지 않을 수 있습니다.)

을하는 방식으로이 제대로 작동하려면, 당신은 오히려 텍스트 모드보다 바이너리 모드에서 파일을 열고 자하는 것입니다 :

file_ptr = fopen("test.txt", "rb+"); 

이후 그렇지 않으면 "문자"의 within-C 정의가 "문자"의 내부 파일 정의와 정확하게 일치하지 않을 수 있습니다 (특히 줄 끝 부분에있을 때). fseek은 후자 중 하나의 중간에 놓을 수 있습니다.

+0

고마워! 그런 식으로 시스템에 알리는 것도 알지 못했을 것입니다 ... 오프셋 매개 변수에서 "L"의 목적은 무엇입니까? – spatara

+0

@spatara : 목적이 없습니다. 그것은 단지'long'으로 만들지 만,'-1'을 쓰면 컴파일러는 어쨌든'long'을 사용하여 선언 된 함수에 전달되므로 암시 적으로'long'으로 변환합니다. 어느 것이 든 100 % 괜찮습니다. – ruakh

관련 문제