C++使用<输入文件和>输出文件启动程序

C++ start programm with < input file and > output file

本文关键字:文件 输出 启动 程序 gt 输入 使用 lt C++      更新时间:2023-10-16

我需要知道如何在C++中使用Unix参数<有人告诉我,如果我用./program < input file > output file运行程序,程序将从<后面声明的文件中读取,并将写入> 之后声明的文件

实际代码看起来像这个

int main(int argc, char** argv){

FILE* filein = fopen(argv[1], "r");
FILE* fileout = fopen(argv[2], "w");

...

所以我想把我在程序中声明的文件放在这里开始处理,因为我稍后将在程序中使用fileinfileout

我只被允许使用stdio.h,所以请保持它的基本功能。

提前感谢

此shell cmd语法

./program < input_file > output_file

不需要对传递给主的参数做任何事情

int main(int argc, char** argv) {

您只需参考std::cinstd::cout即可获得上述输入和输出文件。

它是一个shell特性,称为标准输入/输出流重定向。如果你想通过argv将额外的参数传递给你的程序,你通常会使用以下语法

./program -x --opt1 < input_file > output_file

正如你所说的

"我只被允许使用stdio.h,所以请保持基本。"

在这种情况下,可以使用预定义的stdin/stdout宏。

FILE* filein = stdin;
FILE* fileout = stdout;

这是您应该使用的默认值。如果你想拥有额外的功能,即用户指定特定的输入/输出文件名作为程序参数,你还应该检查传递给你的主命令行参数:

int main(int argc, char* argv[]) {
    FILE* filein = stdin;
    FILE* fileout = stdout;
    if(argc > 1) {
        filein = fopen(argv[1], "r");
    }
    if(argc > 2) {
        fileout = fopen(argv[2], "w");
    }
}

默认情况下,您的程序从标准输入读取并写入标准输出,如果按上述方式执行的话。因此,只需在没有任何参数的情况下调用程序,就会给用户留下输入内容的提示。

这是实现控制台程序的首选且最灵活的风格,控制台程序应处理流式输入并将(处理)转换为任何输出。

void main()
{
  printf("Hello World");
}

这是">"cmd 的一个简单示例

如果您编译了上面的代码,然后运行cmd

./program 

在您的控制台中将输出Hello World

如果你运行

./program >1.txt

然后您将在控制台中看不到任何输出,但您会在文件夹中找到一个名为1.txt的文件(只需我们ls cmd即可查看文件)和int 1.txt(使用vim 1.txt查看内容),您将看到输出Hello World

在这种情况下,CCD_ 22cmd用于将CCD_ 23的输出重定向到CCD_

下面是一个工作示例:

#include <stdio>
int main(void)
{
  // Read in the data from the piped file
  std::string  text;
  std::cin >> text;
  // Send output to the redirected output file
  std::cout << text;
  return 0;
}

同样,不需要使用fopenFILE类型的任何变量,因为操作系统已重定向cin流以使用管道传输到程序中的文件。

编辑1:使用C样式I/O
您还可以使用标准输入和标准输出来使用C形叶I/O。

#include <cstdio>
int main(void)
{
  int a;
  scanf("%d", &a);
  printf("%dn", a);
  return 0;
}

无论您使用C风格I/O还是C++I/O,操作系统都会重定向标准输入和输出流,以便从您(通过重定向)传递到程序的文件中进行读写。

;和>是重定向程序,您只需要从stdin读取并写入stdout。您的程序将通过stdin读取"输入文件"的内容,并且您的程序写入stdout的所有内容都将在输出文件中。

你不需要自己处理这些文件。

当从UNIXshell运行程序时,使用输入和输出重定向将导致shell将标准输出和输入流重定向到这些文件。一旦发生这种情况,您的程序不需要也不会知道。只需像往常一样使用printfscanf(等等)。