只需要分分钟就能写好的c++文件读取我却花了大半天

184 阅读2分钟

一、文章概要

  • 文件读取
  • 文件中逐行读取信息
  • 设置 token 提取每一行的有效信息

二、文件读取

比如读取 1.txt,可以将 1.txt 放到可执行文件所在的目录中。

std::ifstream file("1.txt");

或者直接使用全路径

std::ifstream file("D:\\Test\1.txt");

然后简单使用下面的语句判断是否读取成功

if (!file.good()) 
{
    std::cerr << "Failed to open file\n";
    return -1;
}

三、文件中逐行读取信息

... 中可以对读取到的每一行字符串 line 进行具体的操作。

std::string line;
while (std::getline(file, line)) 
{
    ...
}

当然结束了不要忘了

file.close();

上面提到的 std::getline 是 C++ 标准库中的一个函数,可以从给定的输入流(比如 std::cin 或者std::ifstream等)中读取一行数据。函数的通用原型如下:

std::getline(std::basic_istream<CharT, Traits>& input_stream, std::basic_string<CharT, Traits>& str, CharT delimiter);

其中:

  • input_stream表示要从哪个输入流中读取数据。
  • str是一个std::string类型的引用,用来保存读取到的字符串。
  • delimiter是一个字符类型(比如charwchar_t),表示在读取数据时使用的分隔符(默认值为\n)。
    • 比如按照空格 ' ' 读取就是

      std::istringstream iss(line);//在iss中读取
      std::string token;//读到token中
      std::getline(iss, token, ' ');//按照空格分隔
      

四、设置 token 提取每一行的有效信息

  • find 函数是 C++ 标准库中的一个字符串查找函数,用于在一个字符串中查找指定的子串。如果找到了该子串,则返回该子串在原字符串中的起始位置,如果没有找到,则返回 std::string::npos。其中 std::string::npos 用于表示一个无效的位置, find 函数的返回值 == std::string::npos 就是没找到。
while (std::getline(file, line)) 
{
    std::istringstream iss(line);
    std::string token;
    while (std::getline(iss, token, ' ')) 
    {
        if (token.find("iWidth=") != std::string::npos) {
                std::string strTemp = token.substr(token.find("iWidth=") + 7);
        }
        else if (token.find("iHeight=") != std::string::npos) {
                std::string strTemp2 = token.substr(token.find("iHeight=") + 8);
        }
        else if (token.find("iImgRectIndex=") != std::string::npos) {
                std::string strTemp3 = token.substr(token.find("iImgRectIndex=") + 14);
        }
    }
        
}
  • substr 是 C++ STL 中的一个函数,用于获取字符串的子串。
  • 函数原型如下:
std::string substr(size_t pos = 0, size_t count = npos) const;

其中:

  • pos:子串起始位置,默认为 0,表示从字符串的第一个字符开始。
  • count:子串长度,默认为 npos,表示从起始位置开始一直取到字符串的结尾。
  • 所以上面的代码就是找到指定的字符串后面的字符串了