使用文件取代控制台输入

C语言特别是数组以后的题目,通过控制台输入数据略显繁琐,特别是Debug过程中原始数据需要一次又一次的输入,也是一件蛮浪费时间的工作。我们可以使用freopen函数读取文件中的内容到控制台来取代控制台输入。

首先声明,freopen函数属于头文件stdio.h,属于标准输入输出函数,但在提交OJ时freopen语句应该被注释掉。

我们看一下其的函数声明:

//C89:
FILE *freopen( const char *filename, const char *mode, FILE *stream ); 

//C99:
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);

filename:需要重定向到的文件名或文件路径。

mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。

stream:需要被重定向的文件流(控制台用stdin表示)。

返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。

 

OK,我们以简单的a+b问题来演示一下freopen函数的使用。

 

A + B Problem

【题目描述】

给定两个整数a, b,求两个数之和。

【输入】

输入仅有一行,两个整数a, b (0<=a, b<=10).

【输出】

输出 a+b的值。

【样例输入】

1 2

【样例输出】

3

【参考代码】

我们将样例输入的内容复制到记事本文档,并保存在D盘,名称为in.txt。

in.txt:

1 2

#include <stdio.h>

int main()
{
	freopen("D:\\in.txt","r",stdin);
	
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);

	return 0;
}

编译运行,屏幕输出3,正确。

 

OJ中文件结束的判断:(我们以题目为例)

A + B Problem I

【题目描述】

给定两个整数a, b,求两个数之和。

【输入】

输入数据有多行。

每行数据中含有两个整数a, b (0<=a, b<=109).

【输出】

对每行数据,输出对应a+b的值。

【样例输入】

123 500
60 80
70 90

【样例输出】

623
140
160

【参考程序】

#include <stdio.h>
int main()
{
    int a,b;
    while (1)
    {
        if (scanf("%d %d",&a,&b)==EOF)
            break;
        else
            printf("%d\n",a+b);
    }
    return 0;
}

从上面的参考程序中我们不难发现,scanf读取到文件尾的时候,会返回EOF,只需要判断其返回值是否为EOF就可以判断文件是否读取完毕。

Q&A:

1、关于两条反斜线的问题:

因为C语言中\有很多含义(比如\n表示换行),所以真正使用反斜线时候需要使用转义符,即\\。Unix和Linux中直接使用正斜线/则没有任何问题。

2、关于相对路径引用的问题:

如果文件放在工程目录文件夹下,比如工程目录为D:\data\p1,文件in.txt恰好也在D:\data\p1目录内,则可以使用相对引用,即下列两条语句均成立。

freopen("in.txt","r",stdin);         //相对引用
freopen("D:\\data\\p1\\in.txt","r",stdin);       //绝对引用

3、fscanf,fread,fprintf,fwrite的区别和联系

fread(buffer,size,count,fp)

从fp所指 的文件读入一个数据块。size—读入的字节数,count—读入多少个size字节数据, buffer—读入数据存放内存的起始地址。正常返回count的值。

fwrite(buffer,size, count,fp)

fp所指文件写入一个数据块。size—写入的字节数,count—写入多少个size字节数据,buffer—写入数据在内存的首地址。正常返回count 的值。

fprintf(fp, 格式控制串,输出表列)

输出表列中的数据,按格式控制串 的格式写入由fp所指的文件。

fscanf(fp,格式控制串, 输入表列)

由fp所指文件按格式控制串的格式 读入数据,依次赋给输入表列中相应变量。

4、freopen和fopen的区别

C语言中freopen()函数是用来重新定向的,所谓重新定向是给输入和输出的位置重新定向。原本输入位置是键盘缓存区,输出在屏幕上,用了重新定向后可以将输入位置改变成一个文件,而输出位置也可以输出到一个文件中,具体代码可以这么写:

freopen ("text.txt","r",stdin);  
freopen ("text1.txt","w",stdout);

这里输入和输出便都在文件中操作了。可是这样做有一个弊端,就是所有输入输出都将在文件中操作。

分享