[ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式
ACM中巧用文件的输入输出来改写acm程序的输入输出
经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入。
C/C++代码中:
使用 stdio.h 中包含的另一个函数freopen函数
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
文件名,打开的模式,文件指针,通常使用标准流文件(stdin/stdout/stderr)
因为文件指针使用的是标准流文件,因此我们可以不定义文件指针。
freopen("data.in", "r", stdin); //使用freopen()函数以只读方式r(read)打开输入文件data.in
freopen("data.out", "w", stdout); //使用freopen()函数以写入方式w(write)打开输出文件data.out
这样我们就不再需要修改scanf和printf,因为freopen()函数重定向了标准流,使其指向前面指定的文件。
最后只要使用fclose关闭输入文件和输出文件即可。
fclose(stdin);
fclose(stdout);
若要恢复句柄,可以重新打开标准控制台设备文件,只是这个设备文件的名字是与操作系统相关的。
DOS/Win:freopen("CON", "r", stdin);
Linux: freopen("/dev/console", "r", stdin);
//在程序目录下建立两个文件,data.in和data.out文件
1 #include <stdio.h> 2 3 int main() 4 { 5 freopen("data.in", "r", stdin); 6 //freopen("data.out", "w", stdout); 7 /* 中间按原样写代码,什么都不用修改 */ 8 9 10 11 12 fclose(stdin); 13 //fclose(stdout); 14 return 0; 15 }
//提交代码时只需要注释掉这四句话即可。
而针对于C++的版本则可以这么来写:
1 #include <fstream> 2 streambuf *backup= cin.rdbuf(); //备份标准输入 3 ifstream fin; 4 fin.open("data.in"); 5 cin.rdbuf(fin.rdbuf()); 6 // ... cin will read from file 7 8 9 10 11 cin.rdbuf(backup); // restore cin's original streambuf
不过此版本的代码不如上面的C版本的代码简洁,推荐使用C版本的代码!
最近也常使用Python来写一些在线编程的题目,这里也对应总结一下在Python中的处理方法:
pass
其实针对这里的重定向的意义在于方便对程序的输入做一个处理,故而只需要处理输入即可,输出直接输出到控制台上看起来更为直观。
下面对ACM中的相关输入输出格式做一个总结:
最常见的输入输出个是大致有八种:
1、有多组输入数据,但没有具体的告诉你有多少组,只是让你对应每组输入,应该怎样输出
C/C++中的处理情况 | Python中的处理情况 |
1 while(cin>>a>>b) 2 { 3 //处理; 4 } |
1 while True: 2 try: 3 a, b = map(int, raw_input().strip().split())#这里将前后空格去掉,并且按照空白符进行拆分 4 #pass5 except EOFError: 6 break |
2、输入一个整数n,告诉我们接下来有n组数据,然后在输入数据的具体数据
C/C++中的处理情况 | Python中的处理情况 |
1 while(cin>>n) 2 { 3 for(i=0;i<n;i++) 4 { 5 cin>>a>>b; 6 //处理; 7 } 8 } |
1 while True: 2 try: 3 tcase = int(raw_input().strip()) 4 for case in range(tcase): 5 a, b = map(int, raw_input().strip().split()) 6 7 #pass 8 except EOFError: 9 break |
#pass
3、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |
4、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |
5、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |
6、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |
7、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |
8、有多组输入数据,但是没有具体明确有多少组,但是明确当遇见0,0时结束
C/C++中的处理情况 | Python中的处理情况 |