C++输入输出

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;

[c++ ifstream 读文件 最后一行读两次]

[C++ 读取文件最后一行产生的问题]**

正确示例

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输出就可以。

皮皮blog



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;
}

[Injecting string to 'cin']

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中。

 
 
  1. #include<stdio.h>
  2. int main()
  3. {
  4. freopen("in.txt","r",stdin);
  5. freopen("out.txt","w",stdout);
  6. int a,b;
  7. while(scanf("%d%d",&a,&b)!=EOF)
  8. printf("%d\n",a+b);
  9. fclose(stdin);
  10. fclose(stdout);
  11. return 0;
  12. }

[C语言freopen()函数:文件流重定向,流替换]

皮皮blog



from: http://blog.csdn.net/pipisorry/article/details/37073023

ref:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值