2010-03-24 8 views
2

대학 운영 체제 과정에서 파일 시스템에 대한 프로젝트를하고 있는데 C 프로그램은 사람이 읽을 수있는 파일로 간단한 파일 시스템을 시뮬레이트해야하므로 파일은 행, 행 "부문"이 될 것입니다. 나는 줄을 덮어 쓰는 길이가 같아야한다는 것을 배웠다. 그래서 줄 끝까지 ASCII 0으로 채우고 나중에 채울 수있는 아스키 0 줄을 일정량 남겨 둘 것이다.C 파일의 행 덮어 쓰기

이제는 원하는대로 작동하는지 테스트 프로그램을 만들고 있습니다. 내 코드의 중요한 부분은 다음과 같습니다.

file = fopen("irasproba_tesztfajl.txt", "r+"); //it is previously loaded with 10 copies of the line I'll print later in reverse order 

    /* this finds the 3rd line */ 
int count = 0; //how much have we gone yet? 
char c; 

while(count != 2) { 
    if((c = fgetc(file)) == '\n') count++; 
} 

fflush(file); 

fprintf(file, "- . , M N B V C X Y Í Ű Á É L K J H G F D S A Ú Ő P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n"); 

fflush(file); 

fclose(file); 

이제 파일은 그대로 유지됩니다. 무엇이 문제 일 수 있습니까?

감사합니다. 파일이 "+" 옵션을 열면 here에서

+0

파일이 어떤 모양인지 보여주는 샘플이 도움이 될 수 있습니까? – FrustratedWithFormsDesigner

+1

여기에서 오류를 검사하지 않습니다. 파일이 실제로 성공적으로 열렸습니까? –

+1

줄이 고정 길이이면 각 문자를 읽는 대신 fseek()를 사용하여 섹터로 건너 뛸 수 있어야합니다. - fseek (파일, (bytes_per_line + 1) * line_number, SEEK_SET); – torak

답변

5

,

, 당신은 읽고 에 그것을 쓸 수 있습니다 모두. 그러나 입력 작업 직후에 출력 작업을 수행하지 못할 수도 있습니다. 끼어 들기 "되감기"또는 "fseek"를 개 수행해야합니다. 마찬가지로 출력 작업이 인 직후에 입력 작업을 수행하지 않을 수도 있습니다. 끼어 들기 "되감기"또는 "fseek"를 개 수행해야합니다.

따라서 fflush으로 달성했지만 원하는 위치에 글을 쓰려면 fseek이 필요합니다. 내가 그것을 구현하는 방법이있다 - 내가 추측 더 좋을 수 : 주석 된대로 파일, 즉 file 쓰기/읽기 전에, 성공적으로 열려 있으면

/* this finds the 3rd line */ 
int count = 0; //how much have we gone yet? 
char c; 
int position_in_file; 

while(count != 2) { 
    if((c = fgetc(file)) == '\n') count++; 
} 

// Store the position 
position_in_file = ftell(file); 
// Reposition it 
fseek(file,position_in_file,SEEK_SET); // Or fseek(file,ftell(file),SEEK_SET); 

fprintf(file, "- . , M N B V C X Y Í Ű Á É L K J H G F D S A Ú Ő P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n"); 
fclose(file); 

또한, 당신은 확인해야합니다 확인 :

file = fopen("irasproba_tesztfajl.txt", "r+"); 
if(file == NULL) 
{ 
    printf("Unable to open file!"); 
    exit(1); 
} 
+1

맞음. ANSI C에서는 입력 작업에서 파일 끝을 만나지 않는 한 파일 위치 지정 기능이 출력과 입력 사이에 개입해야합니다. – jschmier

+0

필자는이 주제에 대해 아무 것도 모르지만 이러한 요구 사항으로 인해 IO 액세스가 느려지지는 않습니까? 그렇지 않으면 피할 수있는 통화 간 "패드"호출은 처리 시간이 필요합니다. 그냥 물어 보는 건데. – Moshe

+0

이제 작동합니다. 감사합니다 :) 오류 검사에 관해서는 제가 말했듯이, 이것은 어떻게 작동 하는지를 보여주는 테스트 프로그램 일 뿐이므로 최종 버전 확인 오류를 남겨 둡니다 –