字符串流和格式化
stringstreams and formatting
我正在使用c++编写一个程序,该程序应该与素数做一堆事情。然而,主要的问题是,我有麻烦转换之间的整数和字符串。我认为以下是相关代码:
for(int j=0;j<size-1;j++){
num=primes[j];
ss<<num;
ss>>temp;
ss.str("");
for (int count=0; count < temp.size(); count++) {
cout<<temp<<endl;
}
我知道我可以谷歌一下并找出如何从整数转换成另一种方式。然而,我有一种感觉,我不能弄清楚什么是错的原因是,因为我缺乏一些关于stringstreams的基本知识,我不知道我希望可以修复。num
是int型,ss
是stringstream, cout temp
每次输出2,这是primes[0]
的值。我认为stringstream可能在第一次尝试后没有读取,因为与换行字符有关,但我真的不知道。
您所经历的原因是,在将第一个值读取到temp
后,EOF_BIT将在ss
中设置,之后不能对std::stringstream
进行读写操作,因此temp
不会用新值更新。
用一种更容易理解的方式来解释上面的内容;std::stringstream ss
将认为它已经到达终点(它在某一点上确实到达了终点)。你需要告诉它"从头再来"。(重置所有错误标志),以便在下一次迭代中可用。
如何解决这个问题?
有一些可用的方法,对我来说最清楚的(在代码可读性方面)是为循环中的每个迭代器使用一个新的std::stringstream
(参见"示例解决方案#2)。
查看下面所有将输出的代码片段:
2
3
5
7
11
13
17
例解#1
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
std::stringstream ss;
std::string temp;
for (int i =0; i < PRIMES_SIZE; ++i) {
ss << primes[i];
ss >> temp;
std::cout << temp << std::endl;
ss.clear (); // unset error flags
}
例2
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
for (int i =0; i < PRIMES_SIZE; ++i) {
std::stringstream ss;
ss << primes[i];
std::cout << ss.str () << std::endl;
}
解例#3
#include <iterator>
...
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
std::stringstream ss;
std::copy (primes, primes+PRIMES_SIZE, std::ostream_iterator<int> (ss, "n"));
std::cout << ss.str ();
相关文章:
- 如何从C++中的格式化字符串派生整数?
- C++逐步格式化字符串
- 有没有更快的方法从成员函数返回格式化字符串
- 如何在提升库中格式化字符串
- 使用参数的可变大小向量格式化字符串(例如,将参数向量传递给 std::snprintf)
- 使用 c++ 格式化字符串的自然方法
- 如何在 tchar 中添加格式化字符串(用于多个文件名等)
- 需要从格式化字符串移动到二进制缓冲区
- 格式化字符串
- 用于创建格式化字符串的Variadic模板
- 使用递增的整数 C++ 格式化字符串
- 从variadic函数返回格式化字符串
- 要流式传输的格式化字符串
- 需要帮助格式化字符串输出
- 如何从格式化字符串中获取 Boost::p osix_time::p time
- 以格式化字符串的形式获取经过的时间
- 将数字转换为格式化字符串,然后再次分析格式化字符串
- 为什么在Clang中使用__attribute__((__format__(__printf_..))来避免格式化字符串
- Qt C++将秒转换为格式化字符串(hh:mm:ss)
- 基于其他变量格式化字符串