c ++如何将命令行参数的路径放入fprintf
c++ How to put path from command line argument to fprintf
我无法弄清楚如何从命令行参数获取路径并让我的程序使用 fprinf 写入该文件夹。例如:/here 会将文件写入“here”文件夹,/here 是程序所在位置到需要写入位置的路径。如果路径是 /there/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;
}
此代码有效,但会将文件保存在我当前的文件夹中。变量“路径”是命令行参数。
编辑:这是不将行打印到文件的代码。相反,它从现有文件复制行并将这些行放入“file1.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";
我无法弄清楚如何从命令行参数获取路径并让我的程序使用 fprinf 写入该文件夹。例如:/here 会将文件写入“here”文件夹,/here 是程序所在位置到需要写入位置的路径。如果路径是 /there/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;
}
此代码有效,但会将文件保存在我当前的文件夹中。变量“路径”是命令行参数。
编辑:这是不将行打印到文件的代码。相反,它从现有文件复制行并将这些行放入“file1.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";