0

我有一个从串口记录数据的程序。每隔一段时间,我想拆分文件以使数据日志不会变得非常大。问题是,在我重新创建 FILE* 并尝试写入它之后,程序崩溃了。事先也没有编译器错误/警告...

该程序确实在第一个时间间隔创建了一个日志,但是一旦需要创建一个新的数据日志,它就会在 fwrite 时崩溃。

首先,初始化/声明。

char * DATA_DIR = "C:\DATA";
sprintf(path,"%s%s%s",DATA_DIR,curtime,".log"); //curtime is just the current time in a string
FILE * DATA_LOG = fopen(path, "wb+");   

然后在一个while循环中

if(((CURRENT_TIME-PREVIOUS_TIME) > (SEC_IN_MINUTE * MINUTE_CHUNKS) ) && (MINUTE_CHUNKS != 0) && FIRST_TIME == 0) //all this does is just checks if its time to make a new file
{
    fclose(DATA_LOG); //end the current fileread

    char * path; 
    char curtime[16];

    //gets the current time and saves it to a file name
    sprintf(curtime , "%s" , currentDateTime());
    sprintf(path,"%s%s%s",DATA_DIR,curtime,".log");

    DATA_LOG = fopen(path, "wb+"); //open the new file

    //just some logic (not relevant to problem)
    PREVIOUS_TIME = CURRENT_TIME; 
    newDirFlag = 1;
}
fwrite(cdata , sizeof(char) , numChars , DATA_LOG); //crashes here. cdata, sizeof, and numChars don't change values

任何想法为什么会发生这种情况?我难住了。

4

2 回答 2

1

几个问题,路径没有分配内存(你正在将东西写入一些不好的随机内存地址)。您还应该检查错误的返回值fwrite fopen。如果有一种用途perror,那么您就知道问题所在。很可能 fopen 失败了,或者您正在通过写入path.

也使用snprintf它比sprintf容易受到缓冲区溢出的安全得多。

编辑:刚刚看到你的评论,它是 C++。为什么不使用std::stringandfstream来代替?它们比您目前正在做的更安全(并且可能更容易)。

于 2013-08-20T22:25:09.920 回答
0

您的主要问题是char * path;没有分配内存。这意味着您正在写入内存中的某个 RANDOM [1] 位置。

我建议您使用char path[PATH_MAX];- 这样您就不必担心为您的路径分配和稍后释放存储空间。

或者,您可以使用:

stringstream ss;

ss << DATA_DIR << currentDateTime() << ".log";
string path = ss.str();
fopen(path.c_str(), "wb+")

这是一个更 C++ 风格的解决方案。

[1] 随机,我并不是指真正的随机数,而是恰好位于堆栈上该位置的某个未知值。它几乎总是不是存储字符串的好地方。

于 2013-08-20T23:09:30.807 回答