C++可使用的IO

题目:键盘输入一系列数字(-1结束),输出到a文件中

分别用C++的库,ISO C的库实现,又用getline实现整行的读取(包括空格)。cin、scanf、都是以空格和换行来标志一个输入的,如果输入1 2 3(注意中间有空格)会产生三个输入值。但是如果想输入一个字符串,比如“hello world”那么用cin和scanf就不好用了,用getline可以读入包括空格的一整行字符串。也可以用fgets从标准输入读取一行(包含空格)。这里注意,fgets和getline都把换行符号读入了,而cin和scanf都没有读入换行符,这样在输出的时候要特别注意。下面是这三种的用法

#include <iostream>
#include <fstream>
using namespace std;

//键盘输入一系列数字(-1结束),输出到a文件中

void storeNumbersCPlus();
void storeNumbersC();
void getLineDemo();

int main()
{

        //storeNumbersCPlus();
        storeNumbersC();
        //getLineDemo();
        return 0;
}

void storeNumbersCPlus()
{
        //C++的标准库的实现
        //ofstream out("a", ofstream::out | ofstream::app); //app为append在末尾添加的意思,否则每次都会清除a中的内容的
        ofstream out("a", ofstream::out);
        if(!out)
        {
                cerr<<"open failed"<<endl;
                return;
        }
        int n;
        while(cin>>n)
        {
                if(n == -1)
                        break;
                else
                        out<<n<<endl;//这里必须加个endl或者空格,否则数据之间没有分割,在读的时候会当作一个数据读出来的
        }
        out.close();

        cout<<"The numbers are:"<<endl;

        ifstream input("a");//等价于ifstream input("a", in);默认的状态为in
        if(!input)
        {
                cerr<<"error: unable to open file"<<endl;
                return;
        }
        char s[100] = {0};
        while(input >> s)
                cout<<s<<endl;
        input.close();
}

void storeNumbersC()
{
        //ISO C的标准库的实现
        FILE *file = fopen("b", "w");
        if(file == NULL)
        {
                cout<<"open failed!"<<endl;
                return;
        }
        char buffer[10] = {0};
        while(1){
                //scanf("%s", buffer); //也可以用scanf
                if(NULL == fgets(buffer, 10, stdin))
                        break;
                if(0 == strcmp(buffer, "-1\n"))
                        break;
                else
                {
                        fputs(buffer, file);
                        //fputs("\n", file); //这里要特别注意,如果是用scanf读取的数据,要加的为换行,否则用fgets读取一行的时候,会读出“1 2 3 4”这样的数据
                }
        }
        fclose(file);

        cout<<"The numbers are:"<<endl;

        FILE *fOut = fopen("b", "r");
        if(fOut== NULL)
        {
                cout<<"open failed!"<<endl;
                return;
        }
        char outBuf[10] = {0};
        while(NULL != fgets(outBuf, 10, fOut))
                printf("%s", outBuf);

}

void getLineDemo()
{
        char *line = NULL;
        size_t len = 0;
        ssize_t read = 0;
        FILE *fp = NULL;
        fp = fopen("c", "w");
        if(fp == NULL)
                return;
        while(1)
        {
                if((read = getline(&line, &len, stdin)) != -1)
                {
                        if(strcmp(line, "-1\n") == 0)
                                break;
                        else
                                fputs(line, fp); //getline会自动加上一个换行的,所以这里不需要在加换行
                }
        }
        if(line)
                free(line);

        cout<<"The numbers are:"<<endl;
        char buffer[100] = {0};
        fclose(fp);
        fp = fopen("c", "r");
        while(NULL != fgets(buffer, 100, fp))
                printf("%s", buffer);
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值