gpt4 book ai didi

c++ - C++中的字符串溢出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:34 25 4
gpt4 key购买 nike

我正在使用一个简单的 C++ 程序转换大型图形文件。基本上我主要想切换文件中使用的分隔符。这些图形文件包含极长的行。我的转换适用于小文件,但我在大文件的输出文件中丢失了边缘。所以我检查了我读取的代码部分实际返回了什么,似乎错误已经存在了。使用以下内容,我没有收到 curLineMetisssMetis 中图表的完整行(我的猜测是某处有溢出,我丢失了该行的最后一部分这对于分配的内存来说太大了)

using namespace std;
void exampleFunc(const char* inputfileMetis) {
ifstream metisFile;
metisFile.open(inputfileMetis, ios::in);
if(!metisFile.is_open()) {
cout << "Could not open input file";
return;
}
long nMet = 0;
long mMet = 0;
string curLineMetis;
// skip first line
getline(metisFile, curLineMetis);
while(getline(metisFile, curLineMetis)) {
nMet++;
long targetMetis;
stringstream ssMetis(curLineMetis);
while(ssMetis >> targetMetis) {
mMet++;
}
}
}

我查了一下谷歌,它说 std::string 管理它自己的内存并且不会溢出?我也在没有 stringstream 的情况下尝试了它,只是对之前字符串中的字符使用了一个迭代器,同样的事情发生了。如果这有所作为,我正在使用 c++11。 (错误表现在例如 mMet 中与图形文件本身中规定的边数不同,而顶点数 nMet 是相同的,并且边对于较小的图也是正确的)

最佳答案

我不太确定您的代码出了什么问题。标准库函数和类型应该能够处理长行。但是,为了减少内存使用并解决您的问题,您可能希望一次处理一行的一部分。由于文件格式看起来很有趣,所以我编写了这个程序来将图形读入 vector<vector<int>> .它从该表示中再现图形文件并生成与输入相同的文件。也许这里的东西对你有用。祝你好运。

#include <cassert>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

int
main(int argc, char* argv[])
{
size_t const buf_size = 40; // big enough for a 64bit integer and then some
char buf[buf_size];

assert(argc >= 2);

std::ifstream is (argv[1]);
assert(is);
std::vector<std::vector<int>> graph;
std::vector<int> line;

std::string header;
std::getline(is, header);
{ std::istringstream is_header (header);
size_t n;
is_header >> n;
graph.reserve(n);
}

char delim;
for (;;) {
is.get(buf, buf_size, ' ');
if (!is) break;
is.get(delim);
line.push_back(std::atoi(buf));
while (is.peek() == '\n') {
graph.emplace_back(std::move(line));
(void) is.get();
}
}

std::cout << graph.size() << '\n';
size_t max_row = graph[0].size();
size_t row_sum = graph[0].size();

for (size_t i = 1, I = graph.size(); i < I; ++i) {
max_row = std::max(max_row, graph[i].size());
row_sum += graph[i].size();
}
std::cout << max_row << '\n';
std::cout << row_sum << '\n';

std::ofstream os ("dup.graph");
os << header << '\n';
for (size_t i = 0, I = graph.size(); i < I; ++i) {
for (size_t j = 0, J = graph[i].size(); j < J; ++j)
os << graph[i][j] << ' ';
os << '\n';
}

return 0;
}

关于c++ - C++中的字符串溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35614676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com