【发布时间】:2020-09-06 14:18:14
【问题描述】:
我正在尝试在 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++,对此感到困惑。有没有人可以说点什么?谢谢!
【问题讨论】:
-
始终检查来自
fopen("123.txt", "r")调用的返回,以确保文件已成功打开。 -
我非常怀疑
size_t(tmp)不是编译错误。 -
tmp没有以零终止,因此您的程序具有未定义的行为。 -
@molbdnilo,令人惊讶的是它不是,它产生一个随机数,但没有警告也没有错误。
-
您可能想改写
memset(tmp, 0, sizeof(tmp)); fgets(tmp, sizeof(tmp)-2, fp);。size_t(tmp)所做的是将 tmp 开始的地址转换为 size_t 并将其传递给fgets。该地址可能是一个非常大的数字,您可能会丢弃堆栈。
标签: c++ string stl ubuntu-16.04