【发布时间】:2013-11-05 08:48:43
【问题描述】:
我有一个字符串流,其中包含多行文本。
例如,
f.html Sat Oct 19 22:59:47 2013 23675
folder Mon Nov 4 19:36:14 2013 4096
readdirpractice.cpp Tue Nov 5 03:00:10 2013 1203
server.cpp Mon Nov 4 21:22:27 2013 11369
photo.jpg Wed Oct 23 01:45:04 2013 4360
qq Sun Nov 3 01:54:36 2013 66031
server.cpp~ Mon Nov 4 21:22:25 2013 11368
myhttp.cpp Sun Nov 3 01:43:09 2013 1816
getoptpractice.cpp~ Sun Nov 3 01:15:25 2013 1324
这就是字符串流通常的样子。
当我把这个stringstream转换成string时,信息是一样的。
但是,当我将其转换为 C 字符串时,它只占用了第一行,其他所有行都丢失了。
只有
f.html Sat Oct 19 22:59:47 2013 23675
转换后。
为什么会这样,我该如何解决?
我附上了我的部分代码。
if(is_dir) {
char dirname[1024];
strncpy(dirname, requests[1].c_str(), sizeof(dirname));
dirname[sizeof(dirname)-1] = 0;
DIR *d;
struct dirent *dir;
d = opendir(dirname);
stringstream ss;
if (d) {
while ((dir = readdir(d)) != NULL) {
char* file = dir->d_name;
if(file[0] != '.') {
struct stat sb;
if (stat(file, &sb) == -1) {
cerr << "stat error" << endl;
exit(EXIT_FAILURE);
}
char* lm = ctime(&sb.st_mtime);
string lastmod(lm);
lastmod.at(lastmod.size()-1) = '\0';
string spacing = " ";
ss << file << spacing.substr(0, spacing.size() - strlen(file)) << lastmod << spacing.substr(0, spacing.size() - lastmod.size()) << sb.st_size << '\n';
}
}
closedir(d);
}
//cout << ss.str() << endl; // for testing
char msg2[10000];
strncpy(msg2, ss.str().c_str(), sizeof(msg2));
msg2[sizeof(msg2)-1] = 0;
msg = msg2;
【问题讨论】:
-
@kfsone
stream << std::endl等价于stream << '\n' << std::flush。为什么 OP 应该使用std::endl? -
什么是“味精”? “msg2”的目的是什么? msg 是 std::string 吗?如果是这样,摆脱 msg2 并使用
msg.assign(ss.str().c_str(), std::min(ss.str().size(), 10000); -
endl执行通常不需要的刷新。在文件上使用它会强制执行系统(内核)调用。这不是一个好习惯。 -
msg 在
if(is_dir)之上定义为char *msg。它是返回值。 -
与其分配动态内存,不如使用封装动态字符串内存的类,比如
std::string。使您的函数采用std::string& msg,以便调用者必须提供std::string,然后您的函数所要做的就是填充它。 (请参阅我的答案中的示例)