我在弄清楚如何从命令行参数中获取路径以及让我的程序使用fprinf写入该文件夹时遇到了问题。例如:/here会将文件写入";这里";文件夹,其中/此处是从程序所在位置到需要写入程序的位置的路径。如果路径在/那里/这里也是如此。这只是我代码的这一部分:
void write_file(int sockfd, char* path)
{
int n;
FILE *fp;
char filename[] = "file1.txt";
char buffer[SIZE];
fp = fopen(filename, "w");
if (fp == NULL)
{
std::cerr << "ERROR: Could not write file.n";
exit(EXIT_FAILURE);
}
while (1)
{
n = recv(sockfd, buffer, SIZE, 0);
if (n <= 0)
{
break;
return;
}
fprintf(fp, "%s", buffer);
bzero(buffer, SIZE);
}
fclose(fp);
return;
}
此代码有效,但将文件保存在我当前的文件夹中。变量";路径";是命令行参数。
编辑:这是一种不将行打印到文件中的代码。相反,它从现有文件中复制行,并将这些行放入";文件1.txt";文件
下面是一个使用std::filesystem
(C++17(的示例:
void write_file(int sockfd, const char* path)
{
auto filename = std::filesystem::path(path) / "file1.txt";
std::ofstream out{ filename, ios::trunc | ios::out };
if (!out) {
std::cerr << "ERROR: " << std::strerror(errno) << "n";
exit(EXIT_FAILURE);
}
char buffer[SIZE];
while (1)
{
int n = recv(sockfd, buffer, sizeof(buffer), 0);
if (n == 0)
{
break;
}
if (n < 0) {
std::cerr << "ERROR: " << std::strerror(errno) << "n";
break;
}
if (!out.write(buffer, n)) {
std::cerr << "ERROR: " << std::strerror(errno) << "n";
break;
}
}
}
如果您不支持std::filesystem
,您可以用一些手动路径连接来替换前2条语句,如:
std::string filename = path;
if (filename != "" && filename.back() != '/')
filename += '/';
filename += "file1.txt";