2011-12-21 147 views
0

我将这个代码从stdin读取到char*。是否有可能直接将这个做成std::string从Stdin读取字符串

int size = std::atoi(m_content_size); 
char* buffer; 
buffer = (char*)malloc(size); 
fread(buffer, 1, size, stdin); 

... 

free(buffer); 

我想我可以做std::string sBuffer(buffer),但我希望有更好的选择。

谢谢。

+1

二进制或逐行文本? – 2011-12-21 14:41:15

+2

您想使用的是C还是C++? – 2011-12-21 14:44:45

+2

@EdHeal:由于C中没有'std :: string',它必须是C++(尽管C语言口音强烈)。 – 2011-12-21 14:46:58

回答

2

你或许应该读入字符的矢量左右,只是以如果你真的有任意的二进制数据,不会给人以“文本”的印象:

#include <iostream> 
#include <vector> 

// ... 

std::vector<char> buf(size); 
std::cin.read(buf.data(), buf.size()); 

// all done, will clean up after itself! 
+0

请原谅我的无知 - 是'std :: cin'和'stdin'等价吗? – Eric 2011-12-21 14:53:13

+2

@Eric:'std :: cin'是包装与'stdin'文件指针相同的数据流的istream。他们不是一回事,但他们访问相同的数据。 Iostreams是标准的C++ I/O习惯用法,所以我更愿意给出一个C++的答案。 'std :: fread(buf.data(),1,buf.size(),stdin)'是相应的'FILE *'代码(使用'')。 – 2011-12-21 14:54:30

+0

感谢您的洞察力。出于某种原因,我曾经以为cin代表控制台输入。我会稍微测试一下你的解决方案。再次感谢。 – Eric 2011-12-21 15:54:05

2
int size = std::atoi(m_content_size); 
std::string buffer(size); 
fread(&buffer[0], 1, size, stdin); 

虽然你可以使用cin(和更适合的容器,如果它不是一个字符串,但只是原始的二进制数据)

+0

谢谢。这是否需要任何内存释放? – Eric 2011-12-21 14:52:23

+1

不,它像往常一样由'std :: string'自动处理。 – 2011-12-21 14:55:09

+0

谢谢。我几乎与此一起工作,但我试图减少C库(stdio.h)的使用。无论如何,+1为有效答案。 – Eric 2011-12-21 20:08:24