Vector.push_back() 在从文件读取时添加相同的元素

Vector.push_back() adds same Element while reading from File

我的代码正在从文件中读取一组元素并将它们添加到向量中。 for-loop 读取所有元素,并通过 push_back 将它们添加到向量中。在纸上工作得很好但是:最后向量中的所有元素都是相等的并且总是最后读取的元素。

我 100% 确定文件中列出的元素不相同(因为旧的 NotePad++)。我尝试 c-out 读取元素以检查 f_read 函数是否有问题。该程序以正确的顺序完美地输出了元素。我猜错误不在于文件或 f_read 函数。

FILE* f = fopen(filepath, "rb");
unsigned char header[19];
fread_s(header, sizeof(header), sizeof(unsigned char), 19, f);

vector<char*> myVector;
int size = 28 * 28;
char temp[28 * 28];

for (int i = 0; i < 2; i++) {
    fread_s(temp, 28*28, sizeof(unsigned char), size, f);
    myVector.push_back(temp);
}

(我读入 "info" 字符数组的 19 位是 header)

我希望 Vector 以正确的顺序包含所有读取元素。

如评论中所述,您将指针推回而不是实际的字符串。要获得实际的字符串,您可以这样做:

void readFileToVec()
{
    ifstream file;
    file.open ("rb");
    vector<string> v;
    string word;
    while (file >> word)
    {
        v.push_back(word);
    }
}

如果元素都是字符串并且由 space、制表符或换行符分隔,这将起作用。如果您的单词由这三者之一以外的任何其他方式分隔(例如,用逗号分隔的单词列表),那么您可以使用 getline 并指定分隔符。

无论如何,如果您打算再次使用 C++ 执行此类操作,那么阅读 C++ 流以及 C 风格字符串和 STL 字符串之间的区别将是值得的。您正在使用 C 字符串和旧式 FILE,它是 C 库的一部分,而 C++ 为您提供实用程序,让您的生活更轻松。文件流和 C++ 字符串是此类实用程序的绝佳示例。