2012-01-19 2 views
1

일부 로컬 변수에 따라 내용으로 파일을 생성 중입니다. 파일이 얼마나 오래 끝날 지 모르겠습니다. 고정 크기의 buffer[] 배열을 정의 했으므로 생성 된 파일의 마지막 문자는 가비지입니다. 파일에 쓰기 전에 buffer[] 배열을 어떻게 다듬을 수 있습니까? 또는 fwrite 사용 된 바이트 만?fwrite 전에 버퍼 []에서 사용하지 않는 항목 정리하기

FILE * pFile = NULL; 
char buffer[300]; 
int ret_val = -1; 
strcpy_s(buffer, "The path is \""); 
strcat_s(buffer, pathVariable); 
strcat_s(buffer, "\"\n"); 
pFile = fopen(myfile, "w"); 
if(NULL == pFile) 
{ 
    perror("File opening error"); 
    return -1; 
} 
ret_val = fwrite(buffer, 1, sizeof(buffer), pFile); 
if(sizeof(buffer) != ret_val) 
{ 
    perror("File writing error"); 
    return -1; 
} 
fclose(pFile); 

답변

1

fwrite()은 "사용 된"바이트를 알지 못합니다. 당신이 이렇게 부를 때 :

fwrite(buffer, 1, sizeof(buffer), pFile); 

그것은 sizeof(buffer) 바이트를 쓸 것입니다.

변경에 대한 호출 : used_bytes 당신이 호출하기 전에 설정 몇 가지 변수

ret_val = fwrite(buffer, 1, used_bytes, pFile); 

.

또한 이후의 에러 체크를 변경해야합니다 :이 경우

if(ret_val != used_bytes) 

편집을, 당신이 strlen(buffer)used_bytes을 설정할 것 나타납니다.

+0

'int used_bytes = sizeof ("경로는 \" ") + sizeof (pathVariable) + sizeof ("\ "와 같은 것을하고 싶지 않습니다. \ n ");'누군가는'strcpy'에서 문자열을 바꿀 수 있기 때문에 여기서 변경하는 것을 잊어 버릴 수 있습니다. 'strcpy'와'strcat'는 사용하지 않는 바이트를 -2로 설정합니다. 아마도, -2의 시작을 확인해야합니다. – mustafa

+1

@mustafa : 나는 네가'strlen (buffer)'를 원한다고 생각한다. – NPE

+0

네, 정확히 내가 필요로하는 것이 었습니다. 나는'fwrite (buffer, 1, strlen (buffer), pFile);을 사용해야했다. – mustafa

1

fwrite()에 전달되는 세 번째 인수가 기입하는 바이트의 수는, 그래서 쓰는 대신 사용 :

fwrite(buffer, 1, sizeof(buffer), pFile) 

정말 바이트 당신의 수를 계산 여기

내 코드입니다 다음과 같이 작성하십시오.

fwrite(buffer, 1, numBytesToWrite, pFile) 
+0

감사합니다. – mustafa