我需要编写一个程序来使用系统调用创建文件。
输入文件名以宏形式给出(#define filename"/log/data.log"(。我必须在文件名中添加一个数字,并将其更改为"/log/data_1.log或/log/data_2.log";根据要求。
我正在使用open()
创建文件。
#define filename "/log/data.log"
int fd=0;
int num; //This is the number I want to add to the file name
if(fd = open(file_name, O_RDWR | O_CREAT, 0666) ) < 0 )
{
printf("Could not open the log file: %sn", strerror(errno) );
return -1;
}
您想要这样的东西:
#define filenametemplate "/log/data_%d.log"
...
int num; //This is the number I want to add to the file name
...
char filename[100];
sprintf(filename, filenametemplate, num);
// now filename contains "/log/data123.log" (if num contains 123)
...
我建议使用asprintf((GNU扩展:它在Linux、Mac OS、FreeBSD和其他平台上都可用。
本质上,您将一个char指针初始化为NULL,然后在想要创建新字符串时将其传递给asprintf。它将为其动态分配内存,并返回结果字符串的长度。如果发生错误,它将返回一个负值。在你的C程序开始时,你需要以下内容来展示这些功能,
#define _GNU_SOURCE /* Needed on Linux for asprintf() to be exposed */
#include <stdlib.h> /* For free(), exit() and EXIT_FAILURE */
#include <stdio.h> /* For asprintf() and stderr */
#include <string.h> /* For strerror() */
#include <errno.h> /* For errno */
然后,在您的main((或其他地方,
char *filename = NULL;
if (asprintf(&filename, "/log/data_%d.log", num) < 0) {
fprintf(stderr, "Cannot construct log file name: %s.n", strerror(errno));
exit(EXIT_FAILURE);
}
int fd = open(filename, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
fprintf(stderr, "%s: Cannot create log file: %s.n", filename, strerror(errno));
free(filename);
exit(EXIT_FAILURE);
}
/* Filename is no longer needed; free it */
free(filename);
filename = NULL;