fwrite切断字符串

时间:2015-02-13 01:28:53

标签: c printf fwrite

我正在尝试将程序中的统计信息输出到文件中。我首先创建一些空字符串,然后使用sprintf修改它们,这是因为我需要将浮点数转换成字符。然后我将它们写入文件。 我有点工作,但输出.txt文件只返回4位数的精度,无论我在sprintf中指定什么。

CODE:

   METRIC.RESP_TIME =(( (long int )(tval_after.tv_sec*1000000 + tval_after.tv_usec) - (long int )(tval_before.tv_sec*1000000 + tval_before.tv_usec)));
   METRIC.RESP_TIME = (float) METRIC.RESP_TIME/1000000;
   float ave_resp_time  = METRIC.RESP_TIME/R;
   float ave_through =  METRIC.BYTES_RECEIVED/METRIC.RESP_TIME;

   FILE *fp;
   char size_str [30];  //malloc(((int)strlen(DOWNLOAD_FILE)+ (int)strlen(Q[LOCAL_QUEUE_COUNT].CHORE_NAME)))];
   char rate_str [30];
   char through_put_str [30];

   sprintf(size_str,"TOTAL BYTES RECIEVED [B]: %5.0d  ", METRIC.BYTES_RECEIVED);
   sprintf(rate_str,"TOTAL TIME REQUIRED [s]: %2.8f  ", ave_resp_time);
   sprintf(through_put_str,"AVERAGE THROUGHPUT [B/s]: %2.8f ", ave_through);
   fprintf(stdout,"%d\n",METRIC.BYTES_RECEIVED);

   fp = fopen( METRICS_FILE, "w");
   if(NULL == fp){
   printf("Could not make metrics file: error %d ",errno);
      return 0;
   }
   fwrite(size_str,(size_t)sizeof(size_str),1,fp);       
   fwrite(rate_str,sizeof(rate_str),1,fp);
   fwrite(through_put_str,sizeof(through_put_str),1,fp);
   fclose(fp);
   return 0; 

输出:

     TOTAL BYTES RECIEVED [B]: 5526TOTAL TIME REQUIRED [s]: 0.001AVERAGE THROUGHPUT [B/s]: 2992

希望看起来像:

   TOTAL BYTES RECIEVED [B]: 55264892 
   TOTAL TIME REQUIRED [s]: 0.0019634 
   AVERAGE THROUGHPUT [B/s]: 29929054 

3 个答案:

答案 0 :(得分:1)

您需要一个明确的换行符; fwrite()不会添加一个,您也可以直接使用fprintf()代替您拥有的内容。

要修复您的代码,请执行此操作

sprintf(size_str, "TOTAL BYTES RECIEVED [B]: %5.0d\n", METRIC.BYTES_RECEIVED);
/*                                                 ^ this will break the line */

不需要strcat(size_str, "\0");

你不必这么做,因为你可以

fprintf(fp, "TOTAL BYTES RECIEVED [B]: %5.0d\n", METRIC.BYTES_RECEIVED);
/*                                           ^ this will break the line */

答案 1 :(得分:1)

@Jonathan Leffler所述,使用大小合适的缓冲区,而不是希望30足够。

一种运行良好的方法是根据sprintf()

调整缓冲区的大小
// char size_str [30];
// sprintf(size_str,"TOTAL BYTES RECIEVED [B]: %5.0d  ", METRIC.BYTES_RECEIVED);

#define INT_MAX_PRT (sizeof(int) * CHAR_BIT/3 + 3)
const char rcv_fmt[] = "TOTAL BYTES RECEIVED [B]: %5.0d\n";
char size_str [sizeof rcv_fmt + INT_MAX_PRT];
sprintf(size_str, rcv_fmt,  METRIC.BYTES_RECEIVED);

这种方法对浮点更具挑战性,因为"%f"宽度可能很大。

// char rate_str [30];
// sprintf(rate_str,"TOTAL TIME REQUIRED [s]: %2.8f  ", ave_resp_time);

#define FLT_MAX_PRT (1 /* sign */ + FLT_MAX_10_EXP + 1)
const char *time_fmt[] = "TOTAL TIME REQUIRED [s]: %2.8f\n";
char rate_str[sizeof time_fmt +  FLT_MAX_PRT + 8];
sprintf(rate_str, time_fmt, ave_resp_time);

尽管如此,由于可能会误认为所需的缓冲区大小,代码也可以使用snprintf()来最小化伤害。但最终需要适当大小的缓冲区。

注意:为格式添加了'\n'

答案 2 :(得分:0)

首先,你应该摆脱在任何阵列上使用sizeof的习惯。这会让你比你意识到的更快陷入麻烦。

其次,你似乎在这里做双重任务。根本不需要使用sprintf + fwrite。你应该只是fprintf并传递给你fp作为第一个arg。