我正在尝试在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++,对此感到困惑。有人能说些什么吗?谢谢!
表达式
fgets(tmp, size_t(tmp), fp);
格式不正确,size_t(tmp)
无法按预期工作,您需要sizeof(tmp)
.
您获得的52
值是因为fgets
消耗了n
字符,这也被计算在内,实际上字符串具有51
个字符,并用空格计数。
也就是说,在这种情况下,您可以使用更好的C++工具来替换您正在使用的C工具,fopen
可以使用fstream
库替换,fgets
可以替换为getline
.
像这样:
#include <iostream>
#include <string>
#include <fstream>
int main()
{
std::ifstream fp("123.txt"); //C++ filestream
if (fp.is_open()) {//check for file opening errors
std::string str;
std::getline(fp, str); //C++ read from file
fp.close();
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;
,这是有原因的,这不是一个好的做法,您可以查看此线程以获取更多详细信息。