如何使用ifstream读取文件中的行?

时间:2016-08-29 18:04:33

标签: c++ buffer ifstream readline

我有一个文本文件,其中包含以下信息:

    2B,410,AER,2965,KZN,2990,,0,CR2
2B,410,ASF,2966,KZN,2990,,0,CR2
2B,410,ASF,2966,MRV,2962,,0,CR2
2B,410,CEK,2968,KZN,2990,,0,CR2
2B,410,CEK,2968,OVB,4078,,0,CR2
2B,410,DME,4029,KZN,2990,,0,CR2
2B,410,DME,4029,NBC,6969,,0,CR2
2B,410,DME,4029,TGK,\N,,0,CR2

(这是航空公司的航线信息)

我试图遍历文件并将每行提取到char * - 简单吧?

嗯,是的,它很简单但不是在您完全忘记如何编写成功的i / o操作时! :)

我的代码有点像:

char * FSXController::readLine(int offset, FileLookupFlag flag)
{
    // Storage Buffer
    char buffer[50];
    std::streampos sPos(offset);

    try
    {
        // Init stream
        if (!m_ifs.is_open())
            m_ifs.open(".\\Assets\\routes.txt", std::fstream::in);
    }
    catch (int errorCode)
    {
        showException(errorCode);
        return nullptr;
    }

    // Set stream to read input line
    m_ifs.getline(buffer, 50);

    // Close stream if no multiple selection required
    if (flag == FileLookupFlag::single)
        m_ifs.close();

    return buffer;

}

其中m_ifs是我的ifStream对象。

问题是当我在getline()操作之后断开我的代码时,我注意到' buffer'没改变?

我知道这很简单,但是有人可以对此有所了解 - 我会把我健忘的头发撕掉! :)

P.S:我从未编写过异常处理,所以现在它没用了!

由于

2 个答案:

答案 0 :(得分:3)

这是一个修复,其中包含一些您可能想学习的重要c ++库,以及我认为更好的解决方案。因为您只需要将最终结果作为字符串:

// A program to read a file to a vector of strings 
// - Each line is a string element of a vector container
#include <fstream>
#include <string>
#include <vector>

// ..

std::vector<std::string> ReadTheWholeFile()
{
    std::vector<std::string> MyVector;
    std::string JustPlaceHolderString;
    std::ifstream InFile;

    InFile.open("YourText.txt"); // or the full path of a text file

    if (InFile.is_open())
        while (std::getline(InFile, PlaceHolderStr));
            MyVector.push_back(PlaceHolderStr);

    InFile.close(); // we usually finish what we start - but not needed
    return MyVector;
}

int main()
{
    // result
    std::vector<std::string> MyResult = ReadTheWholeFile();

    return 0;
}

答案 1 :(得分:1)

您的代码存在两个基本问题:

  1. 您正在返回一个局部变量。语句return buffer;会生成dangling指针。

  2. 您使用的是char buffer。在c ++中不鼓励使用C风格的字符串,您应该总是更喜欢std::string

  3. 这是一个更好的方法:

    string FSXController::readLine(int offset, FileLookupFlag flag) {
        string line;
        //your code here 
    
        getline(m_ifs, line) //or while(getline(my_ifs, line)){ //code here } to read multiple lines
        //rest of your code
        return line;
    }
    

    可以找到有关std::string的更多信息here