首先,我已经有8年多没有用C++编写代码了,但我有一个爱好项目,我想在这个项目上遇到这个问题。
我检查了一个类似的问题:Only printing last line of txt file when reading into struct array in C,但在我的示例中,while循环的末尾没有分号。
总之,我有一个存储昵称的nicknames.txt文件,每行一个昵称。然后,我想将这些昵称读入一个数组,并从中随机选择一个元素。示例nicknames.txt
alpha
beta
random nickname
...
Pirate Scrub然后我读取TXT文件:
int nicknameCount = 0;
char *nicknames[2000];
std::string line;
std::ifstream file("nicknames.txt");
FILE *fileID = fopen("asd.txt", "w");
while (std::getline(file, line))
{
nicknames[nicknameCount++] = line.data();
// (1)
fprintf(fileID, "%i: %s\n", nicknameCount - 1, nicknames[nicknameCount - 1]);
}
int randomNickIndex = rand() % nicknameCount;
// (2)
for (int i = 0; i < nicknameCount; i++)
fprintf(fileID, "%i: %s\n", i, nicknames[i]);
fprintf(fileID, "Result: %s\n", nicknames[randomNickIndex]);
fprintf(fileID, "Result: %i\n", randomNickIndex);
fclose(fileID);
exit(0);然后,我在第(1)点看到的就是我所期望的;昵称。然后,在点(2),数组的每个成员都是“盗版洗刷”,这是nicknames.txt的最后一个元素。
我想这一定是显而易见的,但我就是想不通。有什么想法吗?
发布于 2021-10-06 15:17:05
line.data()返回一个指向字符序列的指针。它总是相同的指针。每读一次新行,line的内容都会被覆盖。要解决此问题,您需要复制line的内容。
更改:
char *nicknames[2000];至
char nicknames[2000][256];和
nicknames[nicknameCount++] = line.data();至
strcpy(nicknames[nicknameCount++], line.data());但是,使用向量来存储行可能更好,因为这是C++
发布于 2021-10-06 15:18:25
您的nicknames数组不包含字符串的副本,所有昵称都是指向line拥有的相同数据的指针。
我建议您使用char* nicknames[2000]而不是
std::vector<std::string> nicknames;然后在循环中:
nicknames.push_back(line);发布于 2021-10-06 15:21:01
这一点:
char *nicknames[2000];是指向char的2000个指针的数组。在您的代码中,您实际上并没有存储文件中的字符串。这
nicknames[nicknameCount++] = line.data();仅将指向line内部缓冲区的指针存储在数组中。在下一次迭代中,此缓冲区将被下一行的内容覆盖。
忘记所有的C i/o,混合C和C++是高级的,你在这里不需要它。如果您想在C++中存储动态大小的字符串数组,那就是一个std::vector<std::string>
std::vector<std::string> lines;
std::string line;
while (std::getline(file, line))
{
lines.push_back(line);
}此外,为了写入输出文件,您应该使用std::ofstream。
https://stackoverflow.com/questions/69468326
复制相似问题