我在使用 std::cout、std::stringstream 和 std::string.c_str() 时遇到了一些问题。主要是,似乎有些东西被困在某个地方的缓冲区中,我不知道如何解决这个问题。
如果您不喜欢在 StackOverflow 中阅读代码,这里是我 github 的相关链接:TLString 类、测试类和单元测试——您可以跳到我陈述更简洁问题的最后。
在我的单元测试中,我有以下代码:
Test <std::string> strtest; // A unit test object expecting strings.
Test <const char*> chtest; // A unit test object expecting const char*s
// ...
TurnLeft::Utils::TLString str3("Exterminate.");
// ...
/* Basically, name() and expect() will use the passed arg.
* in the output in order to
* display output such as the following:
* str(): expecting 'Exterminate.' | Actual 'Exterminate.' => PASS
*/ …Run Code Online (Sandbox Code Playgroud) 我有一个类代表内存中的缓冲区
class Buffer
{
public:
Buffer(const char* buffer, size_t size)
:m_buffer(buffer), m_size(size)
{
}
const char* m_buffer;
size_t m_size;
};
Run Code Online (Sandbox Code Playgroud)
我需要重载operator<<这个类,以便可以将其写入std::stringstream这样的
char arr[] = "hello world";
Buffer buf(arr, 11);
std::stringstream ss;
ss << buf;
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?请注意,内存缓冲区NULL之间可能有字符。另外,由于内存缓冲区可能很大,我想避免制作任何额外的副本(除了复制到字符串流中)。
我operator<<像这样重载:
std::ostream& operator<<(std::ostream& os, SomeClass C){
//SomeClass is the class to be represented with operator overloading
os << "{ ";
os << C.getPropertyA() << " ";
os << C.getPropertyB() << " }";
//getPropertyA(), getPropertyB():functions of 'SomeClass' that return std::string
return os;
}
Run Code Online (Sandbox Code Playgroud)
现在我正在使用googletest来测试这样的operator<<重载:
SomeClass C1;
SomeClass C2;
.
.
std::stringstream ss;
std::string str;
//First test
ss << C1;
std::getline(ss, str);
EXPECT_EQ("<some expected value>", str); // googletest test
//Second test
ss.str("");ss.clear(); //Mandatory if 'ss' need …Run Code Online (Sandbox Code Playgroud) 从我在线阅读的内容来看,fmt 库应该比例如 stringstreams 快得多。
然而,我做了一些简单的基准测试(测量系统时间,见下面的代码),似乎 fmt 总是比 stringstreams 慢。我有什么问题吗?
uint64_t start;
uint64_t stop;
long MAXCOUNT = 10000000;
std::srand(123);
int* numbers = new int[MAXCOUNT];
for ( int i = 0; i < MAXCOUNT; i++) {
numbers[i] = std::rand();
}
{
std::string result;
start = currentTimeInMillis();
for ( int i = 0; i < MAXCOUNT; i++) {
result += fmt::format("Number {} is great!", numbers[i]);
}
stop = currentTimeInMillis();
fmt::print("timing fmt : {} ms / string length: {}\n", stop-start, result.size());
}
{
std::string …Run Code Online (Sandbox Code Playgroud) 我正在处理 CSV 并使用以下代码来处理一行。
std::vector<std::string> string_to_vector(const std::string& s, const char delimiter, const char escape) {
std::stringstream sstr{s};
std::vector<std::string> result;
while (sstr.good()) {
std::string substr;
getline(sstr, substr, delimiter);
while (substr.back() == escape) {
std::string tmp;
getline(sstr, tmp, delimiter);
substr += "," + tmp;
}
result.emplace_back(substr);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
它的作用:函数s根据delimiter. 如果分隔符被转义,escape分隔符将被忽略。
此代码有效,但速度非常慢。我怎样才能加快速度?
您是否知道任何现有的 csv 处理实现可以做到这一点以及我可以使用哪些?
我正在处理两段代码,
第一个类使用 AAssetManager(Android NDK 对象)读取“资产”并将其内容保存为单个字符串。然后它将字符串转换为字符串流并对其进行解析。
第二个类解析类型 ifstream,它必须与文件相关联。
有什么方法可以将字符串或字符串流转换为 ifstream,这样我就不必更改其中一个类的全部内容吗?
我无法将 a 转换char为 an int,我不知道为什么。
我只是想将从 CSV 解析的一些数据转换string为int,编译器不会让我转换。
我收到此错误:
从类型 '__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> > >::value_type {aka std::__cxx11::basic_string<char>}' 到类型 'int' 的无效转换
注意我也试过:
static_cast<int>(data[2]);
Run Code Online (Sandbox Code Playgroud)
乃至
'a' - data[2];
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我觉得我已经做了一百万次了。
time_t startDate;
string ID;
int beds;
int numDays;
string token;
vector<string> data;
for(int i = 0; i < 2; i++){ // run through the rest of the file
getline(customers, line);
stringstream s(line); // to parse the csv
while(getline(s,token, ',')){
data.push_back(token);
}
startDate = changeToInt(data[0]);
ID = data[1];
---> …Run Code Online (Sandbox Code Playgroud) 我想将float的内容复制到C++中的字符串.这不起作用.
#include <iostream>
#include <sstream>
using namespace std;
int main() {
float ans = getFloat();
stringstream ss;
string strAns;
ss >> ans;
strAns = ss.str();
cout << strAns << "\n"; // displays "0"
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我不知道这里出了什么问题。
std::stringstream ss("Title");
ss << " (" << 100 << ")";
const char* window_title = &ss.str().c_str();
Run Code Online (Sandbox Code Playgroud)
我跑了make,它不开心。
[17%] Building CXX object CMakeFiles/game.dir/src/main.cpp.o
path: error: cannot take the address of an rvalue of type 'const value_type *'
(aka 'const char *')
const char* window_title = &ss.str().c_str();
^~~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/game.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/game.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
据我所知,我正在创建一个stringstream带有“标题”一词的内容,然后在其后附加“(100)”。在此之后,我正在检索一个字符串,然后是一个“C 字符串”,它是 achar并将指向该字符串的指针存储在window_title.
怎么了?
我使用stringstream来解析字符串,但是它在退出函数时意外地给出了分段错误.
bool check_if_condition(int a)
{
string polygonString1="19.922379 51.666267 19.922381 51.665595 19.921547 51.665705 19.921218 51.665753 19.920787 51.665815 19.919753 51.665960 19.919952 51.666897 19.920395 51.666826 19.920532 51.667150 19.920830 51.667748 19.920989 51.667905 19.921690 51.667906 19.922141 51.662866 19.922855 51.668696 19.922664 51.668237 19.922610 51.668025 19.922464 51.667451 19.922355 51.666732 19.922379 51.666267";
double buf1; // Have a buffer string
stringstream ssPolygonString1(polygonString1); // Insert the string into a stream
double polygon1[2]; // Create vector to hold our words
int iterPoly1=0;
while (ssPolygonString1 >> buf1)
{
polygon1[iterPoly1]=(buf1);
cout<<"buf1="<<buf1<<"\n";
iterPoly1++;
} …Run Code Online (Sandbox Code Playgroud) 我有一个包含代表不同十六进制单词的字符的内存区域。当我打印它们时,我想保留所有字符,但我当前的代码中非零数字的零填充被剥离。例如,如果我在内存中0000输出字符,0000但如果我有0001它输出1. 我目前正在使用 stringstream,但也尝试使用字符数组来构造字符串(请参阅评论):
stringstream ss;
char* data_ptr = sets[set_index]->get_block(block_index)->get_word(word_index);
for (int d = 0; d < 2 * bytes_word; d++){
ss << *(data_ptr + d);
}
data = ss.str();
//char* data_ch = new char[2 * bytes_word];
//char* data_ptr = sets[set_index]->get_block(block_index)->get_word(word_index);
//for (int d = 0; d < 2 * bytes_word; d++){
// data_ch[d] = *(data_ptr + d);
//}
//string data(data_ch);
//delete[] data_ch;
Run Code Online (Sandbox Code Playgroud)
由此我倾向于认为,当我将字符串传递给 stdout 时,实际上可能会进行剥离,我使用cout << data;,因为我的调试模式在两种情况下都显示字符串的内容包含所有 0。如果是这样,我该如何解决?
编辑 - …
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
stringstream ss;
ss << 32;
string str = ss.str();
cout << str << endl
<< str[0] << endl
<< str[1] <<endl
<< str[0]%10;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
32
3
2
1
相反,最后一行应为3,因为3%10 = 3.
c++ ×12
stringstream ×12
string ×6
c++11 ×2
performance ×2
c-strings ×1
csv ×1
fmt ×1
googletest ×1
ifstream ×1
io ×1
mod ×1
vector ×1
zero-pad ×1