从 txt 文件中查找和打印数据

Find and Print data from txt file

我收到字符串 class 的错误消息。根据我在尝试解决此问题时发现的示例,我相信我正确使用了 class。

下面是代码:

int main()
{

    string allData, gridNum;

    ifstream gridData;
    gridData.open ("/Users/Neo/Documents/UNi/Year_3/Grid Data Analysis Program/gridData.txt");

    if (gridData.is_open())
    {
        while ( getline (gridData, allData) )
        {


            size_t gridNum = allData.find("Grid Receiver 34");

            string receiverX = allData.substr (gridNum, 40);

            cout << receiverX << endl;


        }
        gridData.close();
    }

    else cout << "Unable to open file..." << endl;


return 0;
}

控制台出错...

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string
(lldb) 

我正在尝试将文本文件读入字符串变量。我只想读取 "Grid receiver 34" 之后的 40 个字符,然后打印新字符串的内容。

    while ( getline (gridData, allData) )
    {


        size_t gridNum = allData.find("Grid Receiver 34");

        string receiverX = allData.substr (gridNum, 40);

        cout << receiverX << endl;


    }

此处您逐行读取文件,搜索 "Grid Receiver 34",但是,如果未找到该字符串,则 std::string::find 将 return std::string::npos。使用它作为 substr 的参数会给你带来麻烦。你应该在使用它之前检查它是否被找到:

    while ( getline (gridData, allData) )
    {
        size_t gridNum = allData.find("Grid Receiver 34");
        if(gridNum != std::string::npos)
        {
          string receiverX = allData.substr (gridNum, 40);
          cout << receiverX << endl;
        }

    }

此外,停止使用 using namespace std;

您可能在未找到搜索字符串的行上遇到异常。

您只想尝试在找到字符串的行上提取子字符串。

修改您的代码如下:

int main()
{
    string allData, gridNum;

    ifstream gridData;
    gridData.open ("/Users/Neo/Documents/UNi/Year_3/Grid Data Analysis Program/gridData.txt");

    if (gridData.is_open())
    {
        while ( getline (gridData, allData) )
        {
            size_t gridNum = allData.find("Grid Receiver 34");
            if (gridNum != std::string::npos)  // add this condition :-)
            {
                string receiverX = allData.substr (gridNum, 40);
                cout << receiverX << endl;
            }
        }
        gridData.close();
    }
    else cout << "Unable to open file..." << endl;

return 0;
}