C++ fstream和getline的用法

来源:互联网 发布:手机铃声制作软件 mac 编辑:程序博客网 时间:2024/06/05 21:17

今天整点技术性的东西。

例如:文件data.txt内容

1 轻 无 疼 烧 轻
2 轻 无 疼 正常 轻

 

通过C++ fstream和getline的方法将信息读到一个二维数组string data[][]

 

方法一:(适用于已知行数和列数,且要求以空格或制表符间隔)

#include <fstream>
#include <string>

using namespace std;

void main()
{
    ifstream ifile("data.txt");
    string data[2][6];

    for(int i = 0; i < 2; i ++)
      for(int j = 0; j < 6; j ++)
        ifile>>data[i][j];
    ifile.close();
}

 

方法二:(未知行数和列数 且 分割符不限于 空格)

#include <fstream>
#include <string>
#include <vector>

using namespace std;

typedef vector<vector<string>> vvs;

void main()
{
    ifstream infile("data.txt");
    infile>>noskipws;//不忽略空白且把每行最后那个'\n'也读进来
 
    //判断行数和列数,文件中每列数据以空格隔开
    int row, col, k;
    row = col = 0;

    char chr;
    while(infile>>chr)
    {
        switch(chr)
        {
         case '\n':  //判断读入字符是否为换行符
             ++ row;  //是换行符则行数+1
             col = 0; //是换行符则列数清零
         break;
         case ' ':  //判断读入字符是否为空格
         ++ col;  //则列数+1
         break;
         default:;
        }
     }
    infile.close();  //关闭文本文件

    row ++; col++;  //读文件得到的行列数均加1才是真正的行列数(注意:文件最后没有空白行)
 
    vvs data; // 定义二维字符串数组
    data.resize(row);
    for(k = 0; k < row; k ++)
        data[k].resize(col);
 
    ifstream infile2("data.txt");

    int trow, tcol;
    trow = tcol = 0;

    string str;
    while(trow < row)//循环比较,以行数作为限制
    {
        while(tcol < col-1)
        {
            getline(infile2,str,' '); //以空格为分隔对象,进行数据读入
            data[trow][tcol] = str;  //将空格前的数据保存到相应的字符串数组中
            tcol++;      //保存好数据后列数+1
        }
        getline(infile2,str,'\n');  //将回车符作为对象进行数据输入,以判断一行是否结束
        data[trow][tcol] = str;   //将回车符前面的数据读入到相应的字符串数组中
        tcol = 0;      //列数赋值为1,准备下一行的判断
        trow ++;      //行数+1
    }
    infile2.close();

}

原创粉丝点击