0

我有一个问题,我无法真正理解它是如何存在的。

我有一堆按时间排序并包含一堆对象的文件。结果应该是每次在每个对象的目录中排序的一个文件。

它工作得很好,但是在我将Outputstringa转换为char[]要使用fstream.open()的地方,数组的字符比字符串多 3 个字符。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
    string strOutput;
    char *OutputFile;
    short z;

    strOutput = "/home/.../2046001_2013-02-25T0959.txt";
    cout << strOutput << endl;

    OutputFile = new char[strOutput.length()];
    z = 0;
    while (z < strOutput.length())
    {
            OutputFile[z] = strOutput[z];
            z++;
    }

    cout << OutputFile << endl;

    return 0;
}

第一个输出总是正确的,但第二个有时有结尾.txt60A.txt5.a.txt9.A。当它发生时,它总是相同的对象和时间,并且每次尝试都会发生。但并非每个对象都这样做。

由于显而易见的原因,我无法在这个最小的代码片段中重现此错误,但我也不想发布整个 390 行代码。

你有什么建议吗?

4

3 回答 3

4

您在 C 字符串的末尾缺少终止 null 。修理:

OutputFile = new char[strOutput.length() + 1]; // notice +1
z = 0;
while (z < strOutput.length())
{
    OutputFile[z] = strOutput[z];
    z++;
}
OutputFile[z] = 0; // add terminating 0 byte

当然有更好的方法来完成整个事情......你根本不需要复制,只需摆脱OutputFile整个循环,并使用里面的 char 数组std::string

cout << strOutput.c_str() << endl;

我假设真正的代码需要一个 C 字符串。std::cout可以直接打印std::string,当然:

cout << strOutput << endl;

如果你真的想创建一个副本,最好只复制std::string并存储它,并在需要时使用 c_str-method 获取 C 缓冲区:

string OutputFile = strOutput;

如果您知道确实需要从堆分配的原始 char 数组,您应该使用std::unique_ptr(或者可能是其他一些 C++ 智能指针类)来包装指针,因此您不需要手动删除并避免内存泄漏,并且还使用标准进行复制的库函数:

#include <memory>
#include <cstring>

...

unique_ptr<char[]> OutputFile(new char[strOutput.length() + 1];
::strcpy(OutputFile, strOutput.c_str()); // :: means top level namespace
于 2013-03-15T15:39:14.807 回答
1

Char 数组需要一个额外的空字符或\0附加到末尾,否则读取字符串的代码将运行到数组末尾,直到找到一个。

OutputFile = new char[strOutput.length() + 1];
z = 0;
while (z < strOutput.length())
{
    OutputFile[z] = strOutput[z];
    z++;
}
OutputFile[z] = '\0';

如果数组后面的下一个字节恰好为空,它可能会起作用,但这只是巧合。我确定这就是您的代码在第一遍时有效的原因。

于 2013-03-15T15:39:14.527 回答
0

在我将 Outputstring 转换为 char[] 以使用 fstream.open()

你不必那样做。改为执行以下操作:

outfile.open(Outputstring.c_str(), std::fstream::out)

当然,如果你有一个兼容 C++11 的编译器,你可以这样做:

outfile.open(Outputstring, std::fstream::out)
于 2013-03-15T15:54:55.550 回答