C++primer之格式控制.

(1)C++提供了许多控制格式的操纵符.现在通过几个例子来感受一下;

例子1:编写一个程序,输入两个数,要求给出竖式运算的结果.

//利用setw()来进行格式控制.
#include "iostream"
#include "iomanip"
#include "string"
#include "random"
#include "ctime"
using namespace std;
int main()
{
    cout << "please input two number: ";
    string a, b;
    string deng(30, '-');

    while (cin >> a >> b)
    {
        cout << setw(12) << a << endl << 'x' <<
            setw(11) << b << endl << deng << endl;
        cout << setw(12) << atof(a.c_str())*atof(b.c_str());
    }
    return 0;
}

===========================================

(2)seek与tell是IO库提供的用来定位流中数据的位置的.下面通过一个例子来感受它们的作用。

例子2:假设我们有一个文件,我们现在需要统计第1到第i行的累积字节数目.并且写在文件的末尾.请编写程序实现.我们当然可以将文件扫描一遍保存数据然后在写在文件末尾上,但是这样的效率很低.如果文件的行数很大(100万行),那么所需要的内存也会很大.比较好的办法是边读边写,这样效率会提高很多.

//这里需要注意一个细节,原始文件的结尾应该是在有数据的地方再换一行(即下一行的开头).如果不是这样,则会出现bug.现在来分析一下原因.
//假设文件的最后一行是j_(_是结束位置),那么我们在写入数据时就会变成这样:
//j x x x x x.再最后一次读入的时候会将写入的字符也算进去.这是bug1.此外,当我们读入最后一行时,会使得文件达到结束位置,这样流的eofbit就置位了,此时是没有办法对流进行写入的.所以最后一行的数据没有办法写入文件,这是bug2.
//如果我们的原始文件是这样:
//j
//_
//那么当我们读入最后一行的时候就不会受到新写入数据的干扰,也不会到达文件结束的位置.
int main()
{
    fstream is("Text.txt",fstream::ate|fstream::in|fstream::out);
    auto end_mark = is.tellg();
    is.seekg(0, fstream::beg);//重新定位到开头
    string line;
    size_t cnt = 0;
    while (is.tellg() != end_mark&&getline(is, line))
    {
        cnt += line.size() + 1;//记录字节
        auto cur_mark = is.tellg();//保存当前的位置
        is.seekp(0, fstream::end);//定位到文件末尾

        is << cnt ;//向文件末尾写入字节

        if (cur_mark != end_mark) is << " ";
        is.seekg(cur_mark);//恢复到原来的位置
    }
    is.seekg(0, fstream::end);
    is << "\n";
    return 0;
}

你可能感兴趣的:(C++primer之格式控制.)