2014-11-02 2 views
0

파일에 쓰기 위해 write() 시스템 호출을 가져 오는 데 문제가 있습니다. 지금까지 바이너리 파일이라고 불리는 파일에만 횡설수설을 인쇄했습니다. 나는 우리가 어떻게 든 write()를 미리 포맷팅해야한다는 것을 안다.파일에 쓸 write() 시스템 호출 받기

실제로 텍스트 파일에서 작성/쓰기하려면 어떻게해야합니까?

void writeNumbers(int array[], int size, char* fname, int hexFlag) { 

    int fp; 
    int i; 
    char buf[512]; 


    fp = open(fname, O_WRONLY | O_CREAT | O_APPEND);   


    if (fp < 0) { 
      close(fp); 
      char msg[] = "Cannot write"; 
      write(STDOUT_FILENO, msg, sizeof(msg) - 1); 
      exit(1); 
    } 


    if (hexFlag == 0) { 
      for (i = 0; i < size; i++) { 
        snprintf(buf, sizeof(int), "%d ", array[i]); 
        write(fp, buf, sizeof(buf)); 
      } 
    } else { 
      for (i = 0; i < size; i++) { 
        snprintf(buf, sizeof(int), "%x ", array[i]); 
        write(fp, buf, sizeof(int)); 
      } 
    } 
    write(fp, "message", sizeof(buf)); 


    close(fp); 
} 

여기에 int 배열을 16 진수 또는 10 진수 형식으로 인쇄하려고합니다.

+0

다음 줄 : if (fp <0) { close (fp); 열리지 않은 파일을 닫을 수 없으므로 올바르지 않습니다. 따라서 해당 코드 블록에서 'close (fp)'행을 제거하십시오. – user3629249

+1

이 줄은 다음과 같습니다 : write (STDOUT_FILENO, msg, sizeof (msg) -1); 다음과 같아야합니다 : write (STDOUT_FILENO, msg, strlen (msg)); – user3629249

+0

이 줄은 : write (fp, buf, sizeof (buf)); 다음과 같아야합니다 : write (fp, buf, strlen (buf)); – user3629249

답변

2

snprintf()은 전달 된 버퍼에 인쇄되는 문자 수를 반환합니다. 또한 두 번째 인수로 버퍼에 인쇄 할 최대 문자 수 (일반적으로 버퍼 크기)가 적지 만 그 수는 적을 수 있습니다.

snprintf()에 의해 반환 된 것과 정확히 일치하는 문자 수를 써야합니다.

 if (hexFlag == 0) { 
      for (i = 0; i < size; i++) { 
       int result = snprintf(buf, sizeof(buf), "%d ", array[i]); 
       if (0 > result) 
       { 
        write(STDERR_FILENO, "snprintf() failed.\n", strlen("snprintf() failed.\n")); 
       } 
       else 
       { 
        write(fp, buf, result); 
       } 
      } 
     } 
     else 
     ... 

일반적인주의 사항 : 함수 설명서를주의 깊게 읽습니다.

2

snprintf을 호출 할 때마다 sizeof(int) 대신 sizeof(buffer)을 사용해야합니다. write에 대한 각 호출은 세 번째 인수로 strlen(buf)을 가져야합니다.