【问题标题】:Garbage Value in File after write写入后文件中的垃圾值
【发布时间】:2015-06-14 16:07:39
【问题描述】:

我正在制作一个存储在文件中的日志函数。

int log_func(char* msg)
{
    int log_fd=0;
    ssize_t write_ret=0;
    int close_logfile_ret=0;
    time_t result;
    char error_msg[MAX_LOG_MSG_LEN]={' '};
    log_fd = open("/home/pi/log_client.txt", O_CREAT|O_APPEND|O_WRONLY);
    if(log_fd==-1)
    {
        printf("log failed !!----file open");
        exit(1);
    }

    result = time(NULL);
    snprintf(error_msg,MAX_LOG_MSG_LEN,"DALI_Server:%s:%s",asctime(localtime(&result)),msg);
    write_ret = write(log_fd,error_msg,sizeof(error_msg));

    if(write_ret == -1)
    {
        printf("log failed !!---- write");
        exit(1);
    }

    close_logfile_ret = close(log_fd);
    if(close_logfile_ret == -1)
    {
        printf("log failed !!---- close");
        exit(1);
    }
    return 0;
}

这里的数组error_msg 已经被初始化为'space'。但是当我给它写更少的字符时 我得到以下结果。

输入:log_func("DALI Server Started");log_func("File open/create..."); 在文件中输出:

DALI_Server:Thu Jan 16 16:53:56 2014
:DALI Server started ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@DALI_Server:Thu Jan 16 16:54:06 2014
File open/create...^@^@^@^@^@^@^@^@^@..

为什么乱码来了。

【问题讨论】:

  • 你可能想要write_ret = write(log_fd,error_msg,strlen(error_msg));。但是,对于这种 I/O,我建议使用函数 fopenfprintffclose 而不是 openwriteclose
  • 您为什么使用open 而不是fopen?因为open(和writeclose)非常低级。 fopen 给你一个文件指针 (FILE *),这使得代码更简洁,并且拥有更简单的 API

标签: c linux filestream file-handling


【解决方案1】:

您编写了 整个 error_msg 数组,甚至是字符串终止符之后的内容。相反,您应该使用 strlen 来获取数组中 string 的长度,并且只写:

write_ret = write(log_fd, error_msg, strlen(error_msg));

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2022-07-21
  • 1970-01-01
相关资源
最近更新 更多