2012-10-28 2 views
0

파일에서 데이터를 조작하기 위해 stdio 명령을 사용하는 데 문제가 있습니다. 간단히 말해, 파일에 데이터를 쓸 때 write는 성공했다는 것을 나타내는 int를 반환하지만, 내가 다시 읽으면 이전 데이터 만 가져옵니다.stdio 데이터에서 파일에 쓰기 작업하지 않음

struct dE { 
    int key; 
    char data[DataSize]; 
}; 

이 인쇄 :

reading values at 1072 
SeekStatus <1072> 
ReadStatus <32> 
current Key/Data <27/old> 

writing new values 
SeekStatus <1072> 
WriteStatus <32> 

re-reading values at 1072 
SeekStatus <1072> 
ReadStatus <32> 
current Key/Data <27/old> 
+0

'read ((* fd) .fd, cDE, deSize);'정상적으로 컴파일 하시겠습니까? 또한 포인터를 역 참조하려면'->', 즉'cDE-> key'를 사용하십시오. –

+1

변수'offset'와'deSize'의 값을 결코 설정하지 않으므로 아무것도 아닙니다. 'read','write','lseek'의 리턴 값을 절대 체크하지 않습니다. 문제가 있음을 나타내는 COMPILABLE 버전의 코드 또는 질문하는 내용을 줄무늬로 게시해야합니다. 90 %의 시간 동안, 그 compilable example을 만드는 훈련은 당신을위한 질문에 답할 것입니다. –

+0

디렉터리와 파일에 대한 사용 권한이 있습니까? – cowboydan

답변

1

또한
fd = open(filename,O_RDWR|O_APPEND); 

struct dE *cDE = malloc(sizeof(struct dE)); 

//Read present data 
printf("\nreading values at %d\n",off); 
printf("SeekStatus <%d>\n",lseek(fd,off,SEEK_SET)); 
printf("ReadStatus <%d>\n",read(fd,cDE,deSize)); 

printf("current Key/Data <%d/%s>\n",cDE->key,cDE->data); 

printf("\nwriting new values\n"); 
//Change the values locally 
cDE->key = //something new 
cDE->data = //something new 

//Write them back 
printf("SeekStatus <%d>\n",lseek(fd,off,SEEK_SET)); 
printf("WriteStatus <%d>\n",write(fd,cDE,deSize)); 

//Re-read to make sure that it got written back 
printf("\nre-reading values at %d\n",off); 
printf("SeekStatus <%d>\n",lseek(fd,off,SEEK_SET)); 
printf("ReadStatus <%d>\n",read(fd,cDE,deSize)); 

printf("current Key/Data <%d/%s>\n",cDE->key,cDE->data); 

, 여기에 드 구조체는 경우에 당신이 궁금입니다 : 여기

코드의 버전을 박탈이다 open 호출에서 |O_APPEND을 삭제하십시오.

+0

그랬어! 그것은 'O_APPEND'아래의 'man 2 open'에서 엄청난 감독이었습니다 : "각 write (2) 전에 lseek (2)와 같이 파일의 끝에 offset가 위치합니다." – darkpbj