2017-12-08 19 views
-1

코드는 fileReceived에서 가져온 데이터를 a.txt 파일에 추가하지만 대신 임의의 값으로 채워집니다. (잘 랜덤하지는 않지만 확실히 올바른 값). 내가 뭔가를 놓치고 있니?C로 파일에 쓰면 쓰레기 값이 채워짐

File *fp; 
fp = fopen("a.txt",+a); 
while(1) 
{ 
    fileReceived =...// getting char array of 1024 size 
    fwrite(fileReceived,1,sizeof(fileReceived),fp); 

    if(padding!=0) 
    { 
     fclose(fp); 
     break; 
    } 
} 
+3

[최소, 완전하며 검증 가능한 예] (https://stackoverflow.com/help/mcve) – user3386109

+0

누가 패딩을 설정합니까? fileReceived는 어디에서 정의 했습니까? – farbiondriven

+1

'sizeof (fileReceived)'는 아마도 1024가 아니라 포인터의 크기 일 것입니다. –

답변

2

당신이 오른쪽 부분을 표시되지 않는 경우에도 추측 (그러나 그렇지 않으면 수 없습니다) :

fileReceived =...// getting char array of 1024 size 
fwrite(fileReceived,1,sizeof(fileReceived),fp); 

fileReceived그렇게 sizeof(fileReceived)가 아닌, 데이터에 대한 포인터 수있다 1024이지만 아키텍처에 따라 4 또는 8 (배열을 다른 배열에 할당 할 수 없으므로)

루프에 너무 적은 데이터를 쓰고 있고 파일에 마지막 값이 아닌 첫 번째 값이 있습니다. 데이터 크기가 다릅니다

int size = 1024; 
... 
fwrite(fileReceived,1,size,fp); 

경우, 당신이 기능을 사용하면 포인터를 제공 어떤에서 크기 정보를 얻을 수이 하거나 정의되지 않은 동작을 얻을 것이다 : 당신은 크기를 알고 있기 때문에, 이런 식으로 해결

+0

감사합니다. 두 경우 모두 당신이 옳았습니다. 나는 1024 이전 버전을 사용하고있었습니다. –

+0

데이터를 검사 한 결과 최종 패킷의 크기가 1024가 아니 었습니다. 미안, 할당에 대한 모든 세부 정보를 제대로 게시 할 수 없어 전체 코드를 게시 할 수 없습니다. –

+0

문제 없습니다. 마지막 패킷은'fwrite'의 크기를 바꿀 특별한 경우 여야합니다. 하지만 당신은 전체 크기 (크기가 그보다 작을 때까지 1024를 빼낼 수 있도록) 또는 각 반복마다 크기를 알아야합니다. –