我基本上是试图创build一个date和时间作为其名称的日志文件。 这是我的代码
char logger [500]; time_t time1; struct tm * timeinfo; time (&time1); timeinfo = localtime (&time1); sprintf(logger, "TestTreiber_%d%d%d%d%d%d.log",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); printf("All logging during this test is done in : %s",logger); sprintf(logger, "prot/%s",logger);//STEP 1: I encounter the error here FILE *logFile; logFile= fopen(logger,"w");
没有第一步,每件事情都很好。 它在我的程序所在的同一个文件夹中创build了一个我想要的名字的日志文件。 但是当我把第一步加到混音中时,会给我这个错误。
Segmentation Fault (core dumped)
我是Linux的新手,但是我知道它和内存有关,所以我增加了分配给logging器[500]的内存(早期的255,它工作正常)。 但我似乎无法解决这个问题。 保存文件夹确实存在于我正在运行这个目录。 请帮忙!
PS对不起大写字母的错误使用,我正在使用德语键盘。
你不应该在你的代码中这样做,
sprintf(logger, "prot/%s",logger);
从sprintf的man
页引用,
一些程序粗暴地依赖于如下的代码,
sprintf(buf, "%s some further text", buf);
将文本追加到
buf
。 但是,这些标准明确指出,如果在调用sprintf(),snprintf(),vsprintf()和vsnprintf()时source
缓冲区和destination
缓冲区重叠,则结果是不确定的。 根据所使用的gcc版本和所使用的编译器选项,上述调用不会产生预期的结果。
正如其他人所说, sprintf
的目标缓冲区和字符串参数不能重叠。
您先构建基本名称,然后打印它,然后想要预先指定它的路径。 您可以使用两个不同的缓冲区来存储基本名称和路径,但是您也可以一次构建整个路径,并从<libgen.h>
提取包含基本名称的路径的basename
以进行打印:
const char *prefix = "prot"; char logger [500]; time_t time1 = time(NULL); struct tm *ti = localtime (&time1); snprintf(logger, sizeof(logger), "%s/TestTreiber_%d%02d%02d%02d%02d%02d.log", prefix, ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec); printf("Logger is '%s'.\n", basename(logger)); printf("(Full path is '%s'.)\n", logger);
(你应该输出所有字段除了第二位数字以外的所有字段,并用零%02d
格式填充它,这样文件名是明确的。)
因此,首先将sprintf()
更改为snprintf()
但是还必须更改提供给该函数的参数。 事实上,来源和目的地必须有所不同。 如果他们不是,我想它会给出未定义的行为。
所以做这样的事情:
sprintf(newlogger, "prot/%s",logger);