无需使用fopen()读取文件(C语言)

5

我正在进行一项学校项目,其中我们需要在保存为.txt文件的表格上执行某些操作(选择,最小值,最大值)。

问题是我们不能使用常见的函数,如fopen,fscanf,fclose。

该程序将从命令行启动,例如:.\project.exe select parameters <table.txt

您有想法如何在不使用fopen的情况下将.txt文件的内容获取到stdin吗?谢谢。


难道不应该是 ./project select parameters <table.txt 吗? - Am_I_Helpful
命令行壳(在这种情况下是DOS中的cmd.exe)在调用 prog < file 时将程序的标准输入连接到文件;这相当于unix中的 cat file|prog。也就是说,普通的 scanf("%...) 现在将从文件中读取内容,而 prog 并不知道这一点。 - Peter - Reinstate Monica
1
@shekharsuman 你想要问的问题是“难道不应该是...吗?”。答案是“如果是Windows系统,那就不用改”。 - GreenAsJade
@GreenAsJade-OOPS,抱歉,我忘记了Windows! - Am_I_Helpful
1
@JamesMcLeod,不幸的是,OP显然生活在微软的领地中,因此没有openreadclose,但有等效替代方案 - 5gon12eder
2个回答

6
你不需要打开文件 - 操作环境会为你打开。
当你的程序被调用时,使用<table.txt,你的标准输入将从该文件中读取数据而非键盘。你可以使用scanf来读取数据,不必担心打开和关闭文件。
同样适用于你的程序输出和>table_out.txt重定向:你的printf语句将写入一个文件而非屏幕,该文件将在程序退出时自动关闭。当然,如果你需要在输出重定向时将一些东西打印到屏幕上,你可以通过将其打印到stderr(例如:fprintf(stderr, "Invalid table format\n"))来实现。

谢谢。我在CodeBlocks中启动程序时,它没有像应该的那样工作。尝试在命令行中运行,完美地解决了问题。 - user2721842

0

有几种方法可以实现这个。

读取标准输入

我猜老师特别想要这个方法。这个方法的思路是读取标准输入而不是特定文件。 在C++中,你可以简单地读取stdin对象。下面是一个例子:

#include <stdio.h>
#include <string.h>

int main(void)
{
  char str[80];
  int i;

  printf("Enter a string: ");
  fgets(str, 10, stdin);

  /* remove newline, if present */
  i = strlen(str)-1;
  if( str[ i ] == '\n')
      str[i] = '\0';

  printf("This is your string: %s", str);

  return 0;
}

来源:http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm

使用系统工具

您可以调用Windows中的"type"实用程序(不确定)或Linux中的"cat"实用程序作为子进程来读取某个特定文件。但这是一种“hack”,因此我不建议使用它。


文件已经被重定向到标准输入,因此他不需要打开它,因为它已经被打开了。 - Pradheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接