为什么C ++ stl字符串的功能有时有时会出错?

问题描述 投票:0回答:1

我正在尝试在Ubuntu 16.04(GCC&G ++ 5.4和CMake 3.5.1)中使用C ++进行一些文件读取。测试文件(名为123.txt)只有一行字,如下所示:

Reprojection error: avg = 0.110258   max = 0.491361

我只想得到avg错误和max错误。我的方法是得到一条线并将其放入std::string并使用string::find。我的代码非常简单,就像这样:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
    FILE *fp = fopen("123.txt", "r");
    char tmp[60];
    string str;
    fgets(tmp, size_t(tmp), fp);
    fclose(fp);
    cout << tmp << endl;
    str = tmp;
    cout << str.size() << endl;
    size_t avg = str.find("avg");
    size_t max = str.find("max");
    cout << avg << endl;
    cout << max << endl;
}

我可以使用g++成功编译它。但是我遇到一个奇怪的问题。

当我第一次在命令中运行它时,它将得到正确的结果:

Reprojection error: avg = 0.110258   max = 0.491361

52
20
37

如果再次运行代码,有时会出错,就像这样:

p
2
18446744073709551615
18446744073709551615

“ p”是乱码,无法在命令中正确显示。我不擅长C ++,对此感到困惑。有人可以说些什么吗?谢谢!

c++ string stl ubuntu-16.04
1个回答
0
投票

表达式

fgets(tmp, size_t(tmp), fp);

格式不正确,size_t(tmp)将无法按预期工作,需要sizeof(tmp)。就是说,在这种情况下,您可以使用更好的C ++工具来减轻正在使用的C的负担,可以使用fopen库替换fstream,将fgets替换为getline

类似:

#include <iostream>
#include <string>
#include <fstream>


int main()
{
    std::ifstream fp("test.txt"); //propper C++ filestream

    if (fp.is_open()) {//check for file opening errors

        std::string str;
        std::getline(fp, str); //propper C++ way to read from file
        std::cout << str << std::endl;
        std::cout << str.size() << std::endl;
        size_t avg = str.find("avg");
        size_t max = str.find("max");
        std::cout << avg << std::endl;
        std::cout << max << std::endl;
    }
    else{
        std::cerr << "Couldn't open file";
    }
}

请注意,我没有使用using namespace std;,这是有原因的,这不是一个好习惯,您可以查看this thread了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.