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;
}

これは正常にコンパイルされますが、Name には何も表示されません。他のいくつかの方法を試しましたが、まだうまくいきません。正しいデータが「cout << transferstring;」として transferstring に入れられています。正しいデータを印刷します。

なぜこれが機能しないのか、誰にも分かりますか?

4

4 に答える 4

2

の使い方sizeofが間違っています。これは、文字列を保持するオブジェクトのサイズを示しているだけです。ただし、文字列の長さに加えて、null ターミネータの 1 が必要です。代わりに次のように書く必要があります。

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

あなたのコードはちょうど起こるのを待っているバッファオーバーランであることに注意してください。実際のコードでそれを防御する必要があります。

また、これは C++ であるため、.std::copyではなくmemcpy.

于 2013-10-24T10:54:53.330 に答える
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 に答える