gpt4 book ai didi

c - 当给定无效路径时,freopen()创建一个文件

转载 作者:行者123 更新时间:2023-12-03 08:04:52 28 4
gpt4 key购买 nike

我有一个程序,该程序获取两个路径作为命令行参数。第一个参数(实际上是第二个参数,因为第一个是命令名称本身)是程序从中读取文件(输入文件)的路径。第二个是程序写入的文件(输出文件)的路径。

int main(int argc, char *argv[])
{
int num;
/*if there are too many arguments print an error message*/
if(argc > 3)
{
perror("too many arguments");
return EXIT_FAILURE;
}
/*if there is at least one argument use it as path to input file*/
if(argc > 1)
if (!freopen(argv[1], "r", stdin)) {
perror("Path of input file is Invalid");
return EXIT_FAILURE;
}
/*if there are two arguments use the second one as output*/
if(argc == 3)
if (!freopen(argv[2], "w", stdout))
{
perror("Path of output file is Invalid");
return EXIT_FAILURE;
}
/*more code....*/
}
/*(compiled to run file "dtoa.out")*/

该程序运行良好:如果提供了有效的输入和路径输出路径,它将从文件中读取和写入文件;如果提供了太多的参数,或者输入文件的路径无效,则程序将显示错误消息并退出。

问题是当提供无效的输出文件路径时:
$./dtoa ./tests/ExistingInput1.txt ./tests/NonExistingOutput.txt
在这种情况下,程序将只创建丢失的输出文件,而不是返回 NULL并打印错误消息,这是不希望的行为。如何更改它,以便在找不到文件时,该方法将返回 NULL而不是创建新文件?

最佳答案

The problem is when provided with invalid output file path [...] the program will just create the missing output file instead of returning NULL



这是使用 w模式(或基于 wa的任何其他模式)打开文件的已记录行为。如果这不是您想要的,并且您应该考虑是否确实如此,那么您至少在最初需要使用其他模式。如果文件不存在(根据您的要求),则所有 r模式都会导致 fopen()freopen失败。他们中的一些人以允许读写的方式打开文件,例如,
    if (argc == 3) {
if (!freopen(argv[2], "r+", stdout)) {
perror("Path of output file is Invalid");
return EXIT_FAILURE;
}
}

如果要确保 stdout的模式不允许写入,和/或要确保即使没有写入任何内容,目标文件也将被截断,则可以将其重新打开两次,首先是基于读取的模式,如果成功,则处于只写模式:
    if (argc == 3) {
if (!freopen(argv[2], "r+", stdout)) {
perror("freopen (output)");
return EXIT_FAILURE;
}
if (!freopen(NULL, "w", stdout)) {
perror("freopen (output)");
return EXIT_FAILURE;
}
}

关于c - 当给定无效路径时,freopen()创建一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60914835/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com