首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将txt文件的行读入数组仅打印最后一个元素

将txt文件的行读入数组仅打印最后一个元素
EN

Stack Overflow用户
提问于 2021-10-06 15:13:45
回答 3查看 36关注 0票数 0

首先,我已经有8年多没有用C++编写代码了,但我有一个爱好项目,我想在这个项目上遇到这个问题。

我检查了一个类似的问题:Only printing last line of txt file when reading into struct array in C,但在我的示例中,while循环的末尾没有分号。

总之,我有一个存储昵称的nicknames.txt文件,每行一个昵称。然后,我想将这些昵称读入一个数组,并从中随机选择一个元素。示例nicknames.txt

代码语言:javascript
复制
alpha
beta
random nickname
...
Pirate Scrub

然后我读取TXT文件:

代码语言:javascript
复制
    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的最后一个元素。

我想这一定是显而易见的,但我就是想不通。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-06 15:17:05

line.data()返回一个指向字符序列的指针。它总是相同的指针。每读一次新行,line的内容都会被覆盖。要解决此问题,您需要复制line的内容。

更改:

代码语言:javascript
复制
char *nicknames[2000];

代码语言:javascript
复制
char nicknames[2000][256];

代码语言:javascript
复制
nicknames[nicknameCount++] = line.data();

代码语言:javascript
复制
strcpy(nicknames[nicknameCount++], line.data());

但是,使用向量来存储行可能更好,因为这是C++

票数 1
EN

Stack Overflow用户

发布于 2021-10-06 15:18:25

您的nicknames数组不包含字符串的副本,所有昵称都是指向line拥有的相同数据的指针。

我建议您使用char* nicknames[2000]而不是

代码语言:javascript
复制
std::vector<std::string> nicknames;

然后在循环中:

代码语言:javascript
复制
nicknames.push_back(line);
票数 1
EN

Stack Overflow用户

发布于 2021-10-06 15:21:01

这一点:

代码语言:javascript
复制
char *nicknames[2000];

是指向char的2000个指针的数组。在您的代码中,您实际上并没有存储文件中的字符串。这

代码语言:javascript
复制
nicknames[nicknameCount++] = line.data();

仅将指向line内部缓冲区的指针存储在数组中。在下一次迭代中,此缓冲区将被下一行的内容覆盖。

忘记所有的C i/o,混合C和C++是高级的,你在这里不需要它。如果您想在C++中存储动态大小的字符串数组,那就是一个std::vector<std::string>

代码语言:javascript
复制
 std::vector<std::string> lines;
 std::string line;
 while (std::getline(file, line))
 {
    lines.push_back(line);
 }

此外,为了写入输出文件,您应该使用std::ofstream

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69468326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档