我做了一些广泛的搜索,但没有找到适合我的东西,所以我道歉。
char Name[20];
string transferfile;
ifstream file("file.txt");
while (file)
{
getline(file, transferstring, ',');
memcpy(Name, transferString.c_str(), sizeof(transferString));
cout << Name << endl;
}
虽然编译得很好但它在名字中没有给我任何东西。我尝试过其他一些方法但仍然没有运气。正确的数据被放入transfertring中作为'cout&lt;&lt; transferstring;”打印正确的数据。
任何人都知道为什么这不起作用?
答案 0 :(得分:2)
sizeof
的使用不正确。这只是告诉你持有字符串的对象的大小。但是你需要字符串的长度,加上一个用于null终止符。你应该写:
memcpy(Name, transferString.c_str(), transferString.size()+1);
虽然注意到你的代码是缓冲区溢出只是等待发生。你需要在实际代码中防范它。
我还会添加通常的评论,因为这是C ++,您希望使用std::copy
而不是memcpy
。
答案 1 :(得分:1)
我假设transferString
是std::string
- 在这种情况下,使用sizeof
代替transferString.size()
。
您可能还需要在结尾添加另一个\0
字符。
无论如何,你在这里做的事情是相当危险的,如果可能的话,我会尽量避免使用C数组。
答案 2 :(得分: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中。
答案 3 :(得分: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];
}
}
}
}