gpt4 book ai didi

C++ 在 while 循环后 map 的大小仍然是 1

转载 作者:行者123 更新时间:2023-11-28 02:58:51 25 4
gpt4 key购买 nike

我的问题是,在 while 循环之后,我的“mapFile”的大小仍然是 1。我不知道我在哪里弄错了。

这是我的代码:


using namespace std;

int main(void)
{
char buffer[1024];
char *record, *line;

map<char *, vector<char *>> mapFile;
vector<char *> myVector;

char* fileName = "TestFile.csv";

FILE *fstream;

if(( fstream = fopen(fileName, "r")) == NULL) {
printf("File could not be opened\n");
return -1;
}
else{
while((line = fgets(buffer, sizeof(buffer), fstream)) != NULL)
{
record = strtok(line, ",");
char* temp = record;

myVector.push_back(record);
while(record != NULL)
{
record = strtok(NULL, ",");
myVector.push_back(record);
}

mapFile.insert(pair<char *, vector<char *>>(temp, myVector));
}
fclose(fstream);
}

return 0;
}

最佳答案

您正在使用变量 temp 保存的记录地址作为 map 中的键。它的地址始终相同,因此忽略后续添加,因为映射中不允许有多个键。

一个简单的解决方案是用 std::string 替换所有指向空终止字符串(char* 类型变量)的指针。

使用 std::strings 而不是 C 字符串被认为是更现代的 C++ 编码风格,并且更不容易出错。下面的代码在语义上与您的相似,但在 MSVC2013 下编译和运行。我还建议使用 regex 而不是 strtok 或类似的 C 字符串解析函数。 Regex 前期有点智力开销,但从长远来看,它会带来返回,因为它不易出错且功能更强大。

另一方面,如果您的编译器支持,使用 nullptr 而不是 NULL 被认为更好。见What exactly is nullptr?

using namespace std 也被认为是不好的做法,参见:Why is "using namespace std" considered bad practice?

代码如下:

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstring>
int main()
{
char buffer[1024];
char * line;

std::map<std::string, std::vector<std::string>> mapFile;
std::vector<std::string> myVector;

const std::string fileName{ "E:\\test project\\ConsoleApplication1\\Debug\\TestFile.csv" };

FILE *fstream;

if ((fstream = fopen(fileName.c_str(), "r")) == NULL) { //should at least use fopen_s here, see https://stackoverflow.com/questions/906599/why-cant-i-use-fopen
printf("File could not be opened\n");
return -1;
}
else{
while ((line = fgets(buffer, sizeof(buffer), fstream)) != NULL)
{
char * result = strtok(line, ","); //stdtok is very unsafe and outdated, should use regex something simmilar
while (result != nullptr){
myVector.push_back(std::string(result));
result = strtok(nullptr, ","); //stdtok is very unsafe and outdated, should use regex something simmilar
}
if (myVector.empty()){
//TODO handle error here, may be a line like ",,,"
}
else{
mapFile.insert(std::pair<std::string, std::vector<std::string>>(myVector[0], myVector));
}
}
fclose(fstream);
}

return 0;
}

关于C++ 在 while 循环后 map 的大小仍然是 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377876/

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