2013-01-10 5 views
0

파일에서 읽은 다음 파일에있는 문자 (사용자가 지정한 숫자)에/빼기를 ​​추가하고 싶습니다. 또한 사용자가 프로그램이 더하거나 뺄 것인지를 결정합니다. 내 문제는 내가 읽고 루프의 첫 번째 문자를 쓸 수 없다는 것입니다. 첫 번째 문자를 읽었지 만 이미 파일에 쓰여진 내용의 끝에 씁니다. 같은 루프에서 fgetc와 fputc를 사용할 수 없거나 메뉴를 통해 프로 시저를 다시 시작한 후 파일의 시작 부분에 * fp를 보내야한다고 생각합니다. 여기 파일에서 /로 C로 읽기/쓰기

코드입니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
char str[50],keystr[50],*p,c; 
FILE *fp; 
int i,k,key,buff1,buff2,choice; 

start: 

printf("Make a choice\n1.Add\n2.Sub\n3.Exit\n"); 
scanf("%d",&choice); 
if(choice==3) goto end; 
getchar(); 
printf("\nGimme the key"); 
fgets(keystr,50,stdin); 

key=0; 
i=0; 

while(keystr[i]) 
{ 
    key=key+keystr[i]; 
    i++; 
} 
printf("\n%d",key); 
printf("\nDwste onoma arxeiou"); 
fgets(str,50,stdin); 

fp=fopen(str,"r+"); 
if (fp==NULL) printf("error"); 
buff1=0; 
buff2=0; 
for(;;) 
{ 
    if((c=fgetc(fp))==EOF) break; 
    buff1=c; 
    if(choice==1) 
    { 
      buff1=buff1+key; 
      c=buff1; 
      fputc(c,fp); 
      printf("\n%d",buff1); 
    } 
    else if(choice==2) 
    { 
      buff1=buff1-key; 
      c=buff1; 
      fputc(c,fp); 
      printf("\n%d",buff1); 
    } 
} 
goto start; 
end: 
fclose(fp); 
printf("\nBye"); 
    return 0; 

} 같은 루프에서 동일한 파일에 대한 fgetcfputc을 사용할 수 있습니다

+1

호기심 - 왜'대신 함수 호출의 goto' 사용할 수 있습니까? 나는 "스파게티 코드"에 대해 들어 본 적이 있지만 결코 구현 된 것을 보지 못했으며 이것을 결코하지 말라고 가르쳐 줬다. – ChiefTwoPencils

+0

@ C.Lang Agree. 고토는 유명한 악입니다 –

+0

다음과 같은 fseek를 사용할 수 있다고 생각합니다 –

답변

2

,하지만 당신은 당신이 fgetc라는 후 파일 포인터가 있음을 유의해야 다음 문자에 배치하여 fputc 호출이 방금 읽은 문자가 아닌 다음 문자를 쓰게합니다. 물론 fputc은 파일 포인터를 증가시켜 매초 문자를 읽고 쓸 수있게합니다.

방금 ​​읽은 문자를 덮어 쓰려면 fseek을 사용하여 위치를 한 번 뒤로 되 감으십시오.

1

나는 fseek과 아래처럼 뭔가를 작동합니다 생각 : 여기

int opr =0; 
for (;;) 
{ 
fseek(fp,opr,SEEK_SET) 
if((c=fgetc(fp))==EOF) break; 
buff1=c; 
if(choice==1) 
{ 
     buff1=buff1+key; 
     c=buff1; 
     fseek(fp,opr,SEEK_SET); 
     fputc(c,fp); 
     printf("\n%d",buff1); 
     opr++: 
} 
else 
{ 
.... //Similarly for else loop. 
} 
} 
+0

fseek에서 opr이란 무엇입니까? – alex777

관련 문제