http://blog.csdn.net/pipisorry/article/details/37073023
C++标准输入
文件输入只使用fin.eof()永远返回false。当test.txt中存在一字符串“abcd”且没有换行时,程序打印出“abcdd”;当存在以上字符串并且有一新的空行时,程序打印出“abcd”加上一空行。
大家可能有一个误区,认为eof()返回true时是读到文件的最后一个字符,其实不然,eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。如下图所示:
因此,当读到最后一个字符时,程序会多读一次(编译器会让指针停留在最后一个字符那里,然后重复读取一次,这也就是就上面最后一个字符会输出两次的原因。至于是不是所有的编译器都这样处理就不太清楚了。
只要遇到结束符,流就会将状态置为EOF,而不管置位前的操作是否成功。 例如,使用getline函数读取文件的最后一行,如果这一行是因为遇到了EOF而结束的,那么getline操作是成功的,但eof还是会置位。
解决:
1 使用fin.peek(),peek()方法预读取下一个字符(不管是何符号)。从流中取出一个字符,但不移动流指针位置。
!file.eof() && file.peek() != '\n' 或者 !file.eof() && file.peek()!=EOF
其实本质就是读完了一行数据后,再把接下来的换行符读入,再判断下一个符号是什么。如果还是换行符,说明已经结束了。
2 !file.fail()
来判断
3 将条件语句做一下修改if(fin >> str) break;
正确示例
void cpp_in() { /* c++输入 */ string filename("OJ/OJ/Ali/in.txt"); fstream file(filename, ios::in); if (!file) { cerr << "file open error: " << filename << endl; exit(0); } int x, y; while (!file.eof() && file.peek() != EOF) { file >> x >> y; //如果没有读到数字时(空行),xy值不变,但是却不报错! cout << x << ' ' << y << endl; file.get(); // 读取最后的回车符 } }
C++标准输出
c++直接输出大数,而不是科学计数法。
输出浮点数f
cout<<setiosflags(ios::fixed)<<f<<endl;
setiosflags(ios::fixed)就是以定点数格式,而不是科学计数法输出。
输出大整数
类型要是long long,直接lld输出就可以。
C++输入输出重定向
c++将字符串写入标准输入流
c++将字符串写入标准输入流cin/stdin中代替手动命令行输入
#include <iostream> #include <sstream> using namespace std; int main() { istringstream oss("12 34\n" "56 78"); std::cin.rdbuf(oss.rdbuf()); int i1, i2, i3, i4; cin >> i1 >> i2 >> i3 >> i4; cout << "read " << i1 << ',' << i2 << ',' << i3 << ',' << i4; return 0; }
C语言freopen()函数:文件流重定向,流替换
头文件:#include <stdio.h>
freopen()函数用于文件流的的重定向,一般是将 stdin、stdout 和 stderr 重定向到文件。
所谓重定向,就是改变文件流的源头或目的地。stdout(标准输出流)的目的地是显示器,printf()是将流中的内容输出到显示器;可以通过freopen()将stdout 的目的地改为一个文件(如output.txt),再调用 printf(),就会将内容输出到这个文件里面,而不是显示器。
freopen()函数的原型为:
FILE *freopen(char *filename, char *type, FILE *stream);
【参数】filename为要重定向到的文件名;type为文件打开方式,请参考fopen()函数;stream为被重定向的文件流(一般是 stdin、stdout 或 stderr)。
【返回值】成功则返回指向filename文件的指针,否则返回NULL。
示例
从文件in.txt中读入数据,计算加和输出到out.txt中。
- #include<stdio.h>
- int main()
- {
- freopen("in.txt","r",stdin);
- freopen("out.txt","w",stdout);
- int a,b;
- while(scanf("%d%d",&a,&b)!=EOF)
- printf("%d\n",a+b);
- fclose(stdin);
- fclose(stdout);
- return 0;
- }
from: http://blog.csdn.net/pipisorry/article/details/37073023
ref: