C++从文件中读入多行数据

C++从文件中读入多行数据

  • std::ifstream
  • std::getline
  • 利用ifstream和getline从文件中读取多行字符串
  • 练习题
    • C++中文件的读取操作,如何读取多行数据
    • C++中文件的读取操作,如何一个一个的读取数据

C++实现文件读写,可以使用ifstream、ostream来实现
需要包含头文件

#include 

当创建ofstream对象后,可以把ofstream的对象当做cout一样进行输出。

当创建ifstream对象后,可以把ifstream的对象当做cin一样进行输入。

std::ifstream

来自std::ifstream
在这里插入图片描述
常用的成员函数如下

Public member functions

函数 功能
(constructor) Construct object and optionally open file (public member function )
open Open file (public member function )
is_open Check if a file is open (public member function )
close Close file (public member function )
rdbuf Get stream buffer (public member function )

Public member functions inherited from istream

函数 功能
operator>> Extract formatted input (public member function )
gcount Get character count (public member function )
get Get characters (public member function )
getline Get line (public member function )
ignore Extract and discard characters (public member function )
read Read block of data (public member function )
tellg Get position in input sequence (public member function )
seekg Set position in input sequence (public member function )

Public member functions inherited from ios

函数 功能
good Check whether state of stream is good (public member function )
eof Check whether eofbit is set (public member function )
fail Check whether either failbit or badbit is set (public member function )
bad Check whether badbit is set (public member function )
operator bool Evaluate stream (public member function )
rdstate Get error state flags (public member function )
setstate Set error state flag (public member function )
clear Set error state flags (public member function )

Public member functions inherited from ios_base

函数 功能
flags Get/set format flags (public member function )
setf Set specific format flags (public member function )
unsetf Clear specific format flags (public member function )
  • 构造函数
//默认无参构造
ifstream();
//显式有参构造
explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
explicit ifstream (const string& filename, ios_base::openmode mode = ios_base::in);
//禁止复制构造
ifstream (const ifstream&) = delete;
//移动复制构造
ifstream (ifstream&& x);

关于ios_base::openmode mode的取值,有如下几种:

可取的成员值 简述 具体含义
in * input 打开文件以供读取:内部流缓冲区支持输入操作
out output 打开供写入的文件:内部流缓冲区支持输出操作
binary binary 二进制模式
ate at end 从文件末尾开始输出
app append 所有输出操作都发生在文件的末尾,即在文件现有内容的尾部去添加。
trunc truncate 打开之前文件中存在的所有内容都将被丢弃

这个标志可以用或运算(|)来组合

  • 成员函数operator>>
    继承自std::istream
//常见的数值类型,注意这里不支持char&类型,表明不能一次读取一个字符
istream& operator>> (bool& val);
istream& operator>> (short& val);
istream& operator>> (unsigned short& val);
istream& operator>> (int& val);
istream& operator>> (unsigned int& val);
istream& operator>> (long& val);
istream& operator>> (unsigned long& val);
istream& operator>> (long long& val);
istream& operator>> (unsigned long long& val);
istream& operator>> (float& val);
istream& operator>> (double& val);
istream& operator>> (long double& val);
//数组
istream& operator>> (void*& val);

//stream buffers (2)	
istream& operator>> (streambuf* sb );

//manipulators (3)	
istream& operator>> (istream& (*pf)(istream&));
istream& operator>> (ios& (*pf)(ios&));
istream& operator>> (ios_base& (*pf)(ios_base&));

关于operator>>的返回值,
1.返回值为(*this)
2.内部状态错误时,会设置标志位

标志 错误
eofbit 输入序列中没有更多可用字符(到达文件末尾)。
failbit 没有提取任何字符,或者提取的字符不能解释为适当类型的有效值。
badbit 流上的错误(例如,当此函数捕获内部操作引发的异常时)。

-成员函数tellg

streampos tellg();

返回当前字符在流中的位置

  • 成员函数seekg
    设置要从输入流中提取的下一个字符的位置。
istream& seekg (streampos pos);
istream& seekg (streamoff off, ios_base::seekdir way);

参数:
pos
相对于流的开始位置的一个绝对位置,整型
off
相对于参数way指定的起点位置的偏移量,有符号的整型

way
为如下三个值,分别表示流的开始位置,当前位置,结尾位置

way可取的值
ios_base::beg beginning of the stream
ios_base::cur current position in the stream
ios_base::end end of the stream
  • 成员函数read
istream& read (char* s, streamsize n);

从流中提取n个字符并将它们存储在s指向的数组中。
此函数仅复制数据块,而不检查其内容或在末尾添加’\0’。

如果在成功读取n个字符之前到达文件末尾(即流中字符数量小于n个),则s指向的数组将包含直到该点之前读取的所有字符,并且eofbit和 为流设置了故障位标志。

示例

// read a file into memory
#include      // std::cout
#include       // std::ifstream

int main () {
     
  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
     
    // get length of file:
    //1.设置流中下一次提取字符的位置为流的结尾处
    is.seekg (0, is.end);
    //2.返回当前字符在流中的位置,因为前面将位置设置为了结尾处,
    //所以这里返回的就是流中数据的长度
    int length = is.tellg();
    //3.设置流中下一次提取字符的位置为流的开始处
    is.seekg (0, is.beg);

    // 申请能容纳流中完整数据的动态数组
    char * buffer = new char [length];

    //从流中读取数据
    is.read (buffer,length);
   //关闭文件流
    is.close();

    //将buffer的数据写入标准输出cout
    std::cout.write (buffer,length);
    //释放内存
    delete[] buffer;
  }

  return 0;
}
  • 成员函数operator bool

主要是为了能够根据上下文转换为bool类型,使其能够作为判断条件

explicit operator bool() const;

功能:评估stream
返回值:
false:设置了错误标志(failbit或badbit)
true:没有设置错误标志

std::getline

C++ getline函数用法详解
ifstream的成员函数getline可以用于读取一行字符串,但是需要传入固定大小的字符数组,所以一般不符合我们的需求。

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

这里可以使用std::getline,std::getline相比于ifstream的成员函数getline最大的优势在于不需要预先确定一行字符串的长度,一行字符串,你想输入多长,就输入多长。

http://www.cplusplus.com/reference/string/string/getline/?kw=getline
头文件

<string>

函数声明

//可以看出getline支持string类作为参数
istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);

istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

参数:
is    :表示一个输入流
str   :string类型的引用,用来存储输入流中的流信息。
delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

利用ifstream和getline从文件中读取多行字符串

// ifstream constructor.
#include      // std::cout
#include       // std::ifstream
#include        //std::getline
int main () {
     

  std::ifstream ifs ("test.txt", std::ifstream::in);

  std::string str;
  //每次用输入缓冲ifs中读取一行字符串,
  //遇到文件结束符时,getline返回fasle,跳出循环
   while(std::getline(ifs,str))
       std::cout<<str<<std::endl;

  ifs.close();

  system("pause");
  return 0;
}

C++从文件中读入多行数据_第1张图片

练习题

C++中文件的读取操作,如何读取多行数据

将文件的内容读入到一个vector< string >中,将每一行作为一个独立的元素存于vector中。

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
     
    ifstream ifs("test.txt");
    if(!ifs) {
     
        cerr<<"Can't open the file."<<endl;
        return -1;
    }

    string line;
    vector<string> result;
    while(getline(ifs, line))
        result.push_back(line);

    ifs.close();

   for(auto& i:result)
       cout<<i<<endl;

    system("pause");
    return 0;
} 

在这里插入图片描述

C++中文件的读取操作,如何一个一个的读取数据

即将每个单词作为一个独立的元素进行存储

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
     
    ifstream ifs("test.txt");
    if(!ifs) {
     
        cerr<<"Can't open the file."<<endl;
        return -1;
    }

    string line;
    vector<string> result;
    while(ifs>>line)
        result.push_back(line);

    ifs.close();

   for(auto& i:result)
       cout<<i<<endl;

    system("pause");
    return 0;
} 

C++从文件中读入多行数据_第2张图片

你可能感兴趣的:(C++之STL标准模板库,C++基础部分)