gpt4 book ai didi

c++ - 在我编写的处理 csv 文件的相当基本的 C++ 程序中寻找错误

转载 作者:行者123 更新时间:2023-11-28 06:23:26 24 4
gpt4 key购买 nike

似乎无法弄清楚为什么这个程序不能正常工作。它应该将来自 csv 文件的数据存储到一个名为 SurnameInfo 的结构中(当与循环遍历每一行的循环一起使用时)但是每当我运行它时它都会到达 csv 文件的 151671 的第 1280 行,崩溃,并给出窗口“program.exe 已停止工作”弹出窗口。有人看到任何可能导致这种情况的事情吗?谢谢!!

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;

const int MAXLINE = 1000;
const int MAXARRAY = 1000;
int numberOfNames;

struct SurnameInfo
{
char *name;
int count;
float pctrace[6];
};
SurnameInfo*surnames[MAXARRAY];

void processLine(char *line, int n)
{
surnames[n] = new SurnameInfo; //allocate memory
char * pch = strtok(line, ",");//start tokenizing
int len = strlen(pch); // name length
surnames[n]->name = new char[len+1]; //allocate memory
strcpy(surnames[n]->name, pch); // copy name
surnames[n]->count = atoi(strtok(NULL, ","));//get count
for (int i = 0; i < 6; i++)
{
pch = strtok(NULL, ",");
surnames[n]->pctrace[i] = pch[0] == '(' ? -1 : atof(pch);
}
}

void readLines()
{
char line[MAXLINE];
ifstream inputfile;
inputfile.open("names.csv");
if (!inputfile) return; // can't open
inputfile.getline(line, MAXLINE); //skip title
inputfile.getline(line, MAXLINE);
numberOfNames = 0;
while (!inputfile.eof()) //not end of file
{
processLine(line, numberOfNames++);
inputfile.getline(line, MAXLINE);
}
inputfile.close();
}

int main() {
readLines();

return 0;
}

最佳答案

我发现代码与您所说的内容存在差异。const int MAXARRAY = 1000; && SurnameInfo*surnames[MAXARRAY]; 反对 csv 文件的 151671

您正在分配 1000 并试图在无人值守的情况下将更多内容推送到堆,这意味着它开始占用分配给程序本身的内存。或者它试图访问它不应该访问的区域(可能是一些其他进程的程序区域被分配),从而推出一个 Segmentation Fault

此外,您需要有一种方法来破坏动态输入的 Surnames

我的建议:

方法 1: 首先通读文件并获取行数。将相应的内存分配给 Surnames 并按原样进行。虽然它需要额外扫描一次文件,但可以解决您的目的。如果文件大小很大,时间复杂度会非常高。(也许您可以在读取时缓存内容,使用 vector ??(想想看))

方法 2: 实现类似于调整 vector 大小的功能。每次向 Surnames 添加新内容时,释放之前在堆上分配的内存并重新分配更高的内存通过深度复制和插入新信息来规范。

此外,

surnames[n]->pctrace[i] = pch[0] == '(' ? -1 : atof(pch);

我不太确定这是否会正常工作。为了安全和更清晰的代码,将其放在括号中。像这样

surnames[n]->pctrace[i] = ((pch[0] == '(') ? -1 : atof(pch));

如果这是您对 C++ 的第一次尝试,那么这已经做得很好了。干杯。

希望回答对您有所帮助。

关于c++ - 在我编写的处理 csv 文件的相当基本的 C++ 程序中寻找错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954366/

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