c++字符串处理、输入流和输出流

本文介绍了C++中stringstream的两种使用方式以及在处理长字符串时的常见方法,包括std::stringstream的writerFun和writerFun2函数,以及readerFun和readerFun2的读取操作。同时展示了从文件读取和写入字符串到文件的示例,探讨了C++中多行字符串的几种表示形式,包括使用反斜杠、宏定义和Raw String Literals,并分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于std::stringstream* 的使用:

#include <iostream>
#include <string>
#include <sstream>

void writerFun(std::stringstream* stream){
    *stream << "xxx\n";
    *stream << "yyy\n";
    *stream << "zzz\n";
}


void writerFun2(std::stringstream* stream){
    std::ostream *out;
    out = stream;
    *out << "xxx";
    *out << "yyy";
    *out << "zzz";
}


void readerFun(std::stringstream* stream){
    std::string str;
    while(*stream >> str){
        std::cout << str << std::endl;
    }
    
}

void readerFun2(std::stringstream* stream){
    std::istream *read;
    read = stream;
    std::string str;
    while(*read >> str){
        std::cout << str << std::endl;
    }
}

int main()
{
    std::stringstream ss;
    
    writerFun(&ss);
    // writerFun2(&ss);
    
    std::cout << ss.str();
    
    // readerFun(&ss);
    readerFun2(&ss);
}

字符串初始化Json文件,硬编码Json文件,ofstream、ifstream

#include <fstream>
#include <string>
#include <iostream>

int main() {

	std::string str;
	std::ifstream file("E:\\WorkSpace\\VS2019_WorkSpace\\CuraEngine_msvc2019\\test\\fdmprinter.def.json");
	

    if (!file.is_open()) {
        std::cout << "file open fail!!!" << std::endl;
    }

    while (file)
    {
        std::string s;
        getline(file, s);
        //std::cout << s + "/r/n" << std::endl;
        str += s + R"(\r\n)" + "\n";
    }
    file.close();             //关闭文件输入流

    std::ofstream out_file("E:\\WorkSpace\\VS2019_WorkSpace\\CuraEngine_msvc2019\\test\\data.txt");

    if (!out_file.is_open()) {
        std::cout << "file open fail!!!" << std::endl;
    }

    out_file << str;
    out_file.close();

	//std::cout << str << std::endl;

	return 0;
}

C++ 长行字符串多行书写书写规范:

1.使用双引号

string testShader = 
    "uniform mat4 g_mvpMatrix; \n"                    
    "attribute vec3 position;\n"
    "void main ()\n"
    "{\n"
        "gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n"
    "}\n";

缺点:需要每行都写‘\n’。更改后如果一行过长还须拆分成两行,比较麻烦。

2.在字符串换行处加一个反斜杠’\’

string testShader = 
    "uniform mat4 g_mvpMatrix;\n\
    attribute vec3 position;\n\
    void main ()\n\
    {\n\
        gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n\
    }";

缺点:下一行前不能有空格或者Tab键,否则会有多余空格。需要每行都写‘\n’。

3.用带参数宏定义

#define MULTILINE(...) #__VA_ARGS__
...
string testShader = MULTILINE(
        uniform mat4 g_mvpMatrix;\n
        attribute vec3 position;\n
        void main ()\n
        {\n
            gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n
        }
    );

缺点:想打多行的话仍然需要每行后写\n

4.C++11 Raw String Literals

string testShader = R"(uniform mat4 g_mvpMatrix;
       attribute vec3 position;
       void main ()
       {
           gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);
       }
   )";

这个方法最大的好处就是不用每一行打\n了。不过在大部分的文本编辑器中,代码可能会上色不正常。一个hack可以绕开代码上色不正常的问题。

5.使用 R""(…)""!!!!!!!

string testShader = R""(uniform mat4 g_mvpMatrix;
        attribute vec3 position;
        void main ()
        {
            gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);
        }
    )"";

不过这个方法只对某一些比较简单的文本编辑器有用。

通常每行都换行并非必要。这里仅将一段着色器代码作为例子使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值