0

我做了一些广泛的搜索,但没有找到适合我的东西,所以我道歉。

char Name[20];

string transferfile;
ifstream file("file.txt");

while (file)
{
    getline(file, transferstring, ',');
    memcpy(Name, transferString.c_str(), sizeof(transferString));
    cout << Name << endl;
}

虽然这编译得很好,但它在名称中没有给我任何东西。我尝试了其他一些方法,但仍然没有运气。正确的数据被放入 transferstring 作为 'cout << transferstring;' 打印正确的数据。

有人知道为什么这不起作用吗?

4

4 回答 4

2

的使用sizeof不正确。这只是告诉你保存字符串的对象的大小。但是您需要字符串的长度,再加上空终止符的长度。你应该写:

memcpy(Name, transferString.c_str(), transferString.size()+1);

同时注意到您的代码是等待发生的缓冲区溢出。你会想在你的真实代码中防御它。

我还要添加通常的评论,因为这是 C++,所以您希望使用std::copy而不是memcpy.

于 2013-10-24T10:54:53.330 回答
1

我假设transferStringstd::string- 在这种情况下,而不是sizeof使用transferString.size().

您可能还需要\0在最后添加另一个字符。

无论如何,你在这里做的事情是相当危险的,如果可能的话,我会尽量避免使用 C 数组。

于 2013-10-24T10:54:55.537 回答
0

我可以看到您的代码存在一些问题:

  • 您尝试在 std::string 上使用 sizeof (正如其他答案所指出的)

  • 您在 C++ 中使用 memcpy(考虑使用迭代器的 std::copy 作为替代方案);您还尝试将读取数据的大小复制到char[20]. 如果文件中的数据在第一个 ',' 字符之前包含长于 20 的字符串,则会造成缓冲区溢出。

  • 在复制值之前,您不检查读取操作的结果。

您的代码应该/可以是:

while ( getline(file, transferstring, ',') ) // check the state of 
                                             // the stream after getline
{
    cout << transferString << endl;
}

如果要复制到名称中,请使用以下之一:

char *name = nullptr;
while ( getline(file, transferstring, ',') )
{
    name = new char[transferstring.size() + 1];
    std::copy(transferstring.begin(), transferstring.end(), name);
    name[transferstring.size()] = 0;
}
// somewhere later:
delete []name;

或者:

char name[20];
while ( getline(file, transferstring, ',') )
{
    std::size_t size = std::min(transferstring.size(), 19);
    std::copy_n(transferstring.begin(), size, name); // copy at most 19 characters
    name[size] = 0;
}

我的选择是根本不使用 char 数组并将值保存在 std::string 中。

于 2013-10-24T11:13:34.690 回答
0
//an alternative way when stl isn't working
    #include <iostream>
    #include <string>
    #include <fstream>

    using namespace std;

    int main()
    {
        char Name[20];

        string transferfile;
        ifstream in("file.txt");

        while (!(in.eof()))//read till the end of the file
        {
            in>>transferfile;
                if(!in.eof())
                {
                    for(int i=0;i<transferfile.length();i++)//copy al the letters from the string
                {
                    Name[i] = transferfile[i];
                }
                for(int i=0;i<transferfile.length();i++)//print the array 
                {
                    cout<<Name[i];
                }
            }
        }

    }
于 2013-10-24T11:26:47.307 回答