如何以这种格式用 C 读取文件 ./filec <input.in> <output.myout>
How to read files in C, in this format ./filec <input.in> <output.myout>
我目前正在做一个使用输入文件的项目。
代码正在做我想做的一切,它完全正确,问题是我读取文件的方式。
FILE *fp;
fp = fopen (argv[1], "r");
我在终端中使用 ./filec input.in,所有内容都在终端中正确打印,但我必须以这种方式打开文件:
./filec < input.in > < output.myout > 我不确定那意味着什么。
谢谢,抱歉英语不好
您可能误解了 --help 选项,您描述的第一个符号对于命令行参数是正确的。 ""只是一个使用的符号,意思是您可以更改<>之间的部分名称。
无论如何,如果您确实需要使用该表示法来调用您的程序,您可以创建一个包含 argv[1] 且不带 <> 的新数组。
伪代码:
char newFilename[20];
//skip first and last character (if needed, changes values to skip first two and last two chars
for(i = 1; i < argv[1].length - 2; i++){
newFilename[i - 1] = argv[1][i];
}
fp = fopen (newFilename, "r");
注意 < 和 > 字符被解释为文件重定向操作,所以你应该这样做(在这种情况下)./youprogram "< file.in >" "< file.out >"
我假设你打错了,你的意思是:
./filec < input.in > output.myout
基本上,这意味着您让 shell 为您完成所有工作,您的代码可以简单地从标准输入读取并写入标准输出。你可以试试:
fp = argc > 1 ? fopen(argv[1], "r") : stdin;
您想阅读 stdin
当调用 fopen
时,您 总是 应该检查失败,例如(在测试 argc>1
之后,假设您按照常规定义了 int main(int argc, char**argv)
!)
FILE *fp = fopen (argv[1], "r");
if (!fp) {perror(argv[1]); exit(EXIT_FAILURE); };
所以你可能想要:
FILE *fp = NULL; // I prefer always initializing variables
if (argc>1) {
fp = fopen (argv[1], "r");
if (!fp) {perror(argv[1]); exit(EXIT_FAILURE); };
}
else fp = stdin;
如果您以 ./myprog < someinput.txt > someoutput.txt
调用您的程序,那么您 printf
、putchar
或发送到 stdout
的所有内容都会进入 someoutput.txt
,并且 stdin
是 someinput.txt
。通常重定向是在外部完成的(通过 POSIX 系统上的 shell)
您的 argv[1]
将拥有输入文件,而您的 argv[2]
将拥有 output
文件。
您可以使用的基本开始布局是:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
if (argc != 3)
{
exit(EXIT_FAILURE); //If there are not three arg, terminate the program.
}
FILE *fp_read, *fp_write;
fp_read = fopen(argv[1],"r");
fp_write = fopen(argv[2],"w");
//Do whatever you want with it.
fclose(fp_read);
fclose(fp_write);
return 0;
}
我目前正在做一个使用输入文件的项目。 代码正在做我想做的一切,它完全正确,问题是我读取文件的方式。
FILE *fp;
fp = fopen (argv[1], "r");
我在终端中使用 ./filec input.in,所有内容都在终端中正确打印,但我必须以这种方式打开文件: ./filec < input.in > < output.myout > 我不确定那意味着什么。
谢谢,抱歉英语不好
您可能误解了 --help 选项,您描述的第一个符号对于命令行参数是正确的。 ""只是一个使用的符号,意思是您可以更改<>之间的部分名称。
无论如何,如果您确实需要使用该表示法来调用您的程序,您可以创建一个包含 argv[1] 且不带 <> 的新数组。
伪代码:
char newFilename[20];
//skip first and last character (if needed, changes values to skip first two and last two chars
for(i = 1; i < argv[1].length - 2; i++){
newFilename[i - 1] = argv[1][i];
}
fp = fopen (newFilename, "r");
注意 < 和 > 字符被解释为文件重定向操作,所以你应该这样做(在这种情况下)./youprogram "< file.in >" "< file.out >"
我假设你打错了,你的意思是:
./filec < input.in > output.myout
基本上,这意味着您让 shell 为您完成所有工作,您的代码可以简单地从标准输入读取并写入标准输出。你可以试试:
fp = argc > 1 ? fopen(argv[1], "r") : stdin;
您想阅读 stdin
当调用 fopen
时,您 总是 应该检查失败,例如(在测试 argc>1
之后,假设您按照常规定义了 int main(int argc, char**argv)
!)
FILE *fp = fopen (argv[1], "r");
if (!fp) {perror(argv[1]); exit(EXIT_FAILURE); };
所以你可能想要:
FILE *fp = NULL; // I prefer always initializing variables
if (argc>1) {
fp = fopen (argv[1], "r");
if (!fp) {perror(argv[1]); exit(EXIT_FAILURE); };
}
else fp = stdin;
如果您以 ./myprog < someinput.txt > someoutput.txt
调用您的程序,那么您 printf
、putchar
或发送到 stdout
的所有内容都会进入 someoutput.txt
,并且 stdin
是 someinput.txt
。通常重定向是在外部完成的(通过 POSIX 系统上的 shell)
您的 argv[1]
将拥有输入文件,而您的 argv[2]
将拥有 output
文件。
您可以使用的基本开始布局是:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
if (argc != 3)
{
exit(EXIT_FAILURE); //If there are not three arg, terminate the program.
}
FILE *fp_read, *fp_write;
fp_read = fopen(argv[1],"r");
fp_write = fopen(argv[2],"w");
//Do whatever you want with it.
fclose(fp_read);
fclose(fp_write);
return 0;
}