C 写入后文件中的垃圾值

C 写入后文件中的垃圾值,c,linux,filestream,file-handling,C,Linux,Filestream,File Handling,我正在制作一个日志函数,它存储在一个文件中 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_WRON

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

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;
}
此处,数组错误消息已初始化为“space”。但是当我在上面写更少的字符时 我得到以下结果

输入:
log_func(“DALI服务器已启动”);日志功能(“文件打开/创建…”)
文件中的输出:

DALI_Server:Thu Jan 16 16:53:56 2014
:DALI Server started ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@DALI_Server:Thu Jan 16 16:54:06 2014
File open/create...^@^@^@^@^@^@^@^@^@..
为什么会出现垃圾字符。

您编写整个
error\u msg
数组,甚至是字符串终止符之后的内容。相反,您应该使用
strlen
获取数组中字符串的长度,并且只写入以下内容:

write_ret = write(log_fd, error_msg, strlen(error_msg));
您可以编写整个
error\u msg
数组,甚至是字符串终止符后面的内容。相反,您应该使用
strlen
获取数组中字符串的长度,并且只写入以下内容:

write_ret = write(log_fd, error_msg, strlen(error_msg));
您可以编写整个
error\u msg
数组,甚至是字符串终止符后面的内容。相反,您应该使用
strlen
获取数组中字符串的长度,并且只写入以下内容:

write_ret = write(log_fd, error_msg, strlen(error_msg));
您可以编写整个
error\u msg
数组,甚至是字符串终止符后面的内容。相反,您应该使用
strlen
获取数组中字符串的长度,并且只写入以下内容:

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

您可能需要
write\u ret=write(log\u fd,error\u msg,strlen(error\u msg))。但是,对于这种类型的I/O,我建议使用函数
fopen
fprintf
fclose
,而不是
open
write
close
。您为什么要使用
open
而不是
fopen
?因为
open
(和
write
close
)是非常低级的
fopen
为您提供了一个文件指针(
file*
),它使代码更干净,并且拥有一个您可能想要的更简单的API
write\u ret=write(log\u fd,error\u msg,strlen(error\u msg))。但是,对于这种类型的I/O,我建议使用函数
fopen
fprintf
fclose
,而不是
open
write
close
。您为什么要使用
open
而不是
fopen
?因为
open
(和
write
close
)是非常低级的
fopen
为您提供了一个文件指针(
file*
),它使代码更干净,并且拥有一个您可能想要的更简单的API
write\u ret=write(log\u fd,error\u msg,strlen(error\u msg))。但是,对于这种类型的I/O,我建议使用函数
fopen
fprintf
fclose
,而不是
open
write
close
。您为什么要使用
open
而不是
fopen
?因为
open
(和
write
close
)是非常低级的
fopen
为您提供了一个文件指针(
file*
),它使代码更干净,并且拥有一个您可能想要的更简单的API
write\u ret=write(log\u fd,error\u msg,strlen(error\u msg))。但是,对于这种类型的I/O,我建议使用函数
fopen
fprintf
fclose
,而不是
open
write
close
。您为什么要使用
open
而不是
fopen
?因为
open
(和
write
close
)是非常低级的
fopen
为您提供一个文件指针(
file*
),使代码更清晰,还有一个更简单的APIbut space character应该在那里为什么^@@i和See但是space character应该在那里为什么^@@i和See但是space character应该在那里为什么^@@i和See但是space character应该在那里为什么^@@i和See