Visual Studio C++ 的一个简单示例

Visual Studio 项目属性设置:

项目属性→C/C++→常规→附加包含目录

复制代码
C:\Intel\include\iconv\include;

项目属性→链接器→常规→附加库目录

复制代码
C:\Intel\include\iconv\lib;

项目属性→链接器→输入→附加依赖项

复制代码
iconv.lib;

提示缺少"iconv.dll",需要将iconv.dll拷贝至main.cpp同阶目录。

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include "C:\Intel\include\iconv\include\iconv.h"

//#pragma comment (lib, "iconv.lib")

using namespace std;

string gb2312_to_utf8(const string& input);
bool FileConvertGb2312ToUtf8(string pathFile);
void SaveToLog(string path, string content);


int main(int argc, char* argv[])
{
    int n = 0;

    string path = string(argv[0]);
    string pathLog = path.substr(0, path.find_last_of('\\') + 1) + "log.txt";

    string log = string("123成功了Hello,world!");

    SaveToLog(pathLog, log);

    FileConvertGb2312ToUtf8(pathLog);

    cin >> n;

    return n;
}

bool FileConvertGb2312ToUtf8(string pathFile)
{
    int pos = pathFile.find_last_of("\\");
    string nameFile = pathFile.substr(pos + 1, pathFile.length() - pos - 5);

    ifstream infile(pathFile, ios::binary);
    if (!infile) {
        cerr << "Failed to open input file" << endl;
        return 1;
    }

    string content((istreambuf_iterator<char>(infile)), istreambuf_iterator<char>());
    infile.close();

    string utf8_content = gb2312_to_utf8(content);
    if (utf8_content.empty()) {
        cerr << "Failed to convert encoding" << endl;
        return 1;
    }

    //pathLog = pathLog.replace(pathLog.find_last_of("log") + 1, 0, "_utf8");
    string pathFileNew = pathFile.replace(pathFile.find_last_of(nameFile) + 1, 0, "_utf8");
    ofstream outfile(pathFileNew, ios::binary);
    if (!outfile) {
        cerr << "Failed to open output file" << endl;
        return 1;
    }

    outfile.write(utf8_content.data(), utf8_content.size());
    outfile.close();

    puts("文件转换成功!");
    puts(pathFileNew.c_str());

    return true;
}

string gb2312_to_utf8(const string& input)
{
    iconv_t cd = iconv_open("UTF-8", "GB2312");
    if (cd == (iconv_t)-1) {
        cerr << "iconv_open failed" << endl;
        return "";
    }

    size_t inbytesleft = input.size();
    size_t outbytesleft = inbytesleft * 2;
    char* inbuf = const_cast<char*>(input.c_str());
    char* outbuf = new char[outbytesleft];
    char* outptr = outbuf;

    if (iconv(cd, (const char**)&inbuf, &inbytesleft, &outptr, &outbytesleft) == (size_t)-1) {
        cerr << "iconv failed" << endl;
        iconv_close(cd);
        delete[] outbuf;
        return "";
    }

    string output(outbuf, outptr - outbuf);
    delete[] outbuf;
    iconv_close(cd);
    return output;
}

void SaveToLog(string path, string content)
{
    ofstream outfile(path);

    if (outfile.is_open())
    {
        outfile << content;
        outfile.close();
        puts("文件保存成功");
        puts(path.c_str());
    }
    else
    {
        puts("文件保存失败");
        puts(path.c_str());
    }
}
相关推荐
沫璃染墨32 分钟前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌40 分钟前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
醉城夜风~1 小时前
(超详细)C++ STL list容器详解:从使用方法到双向链表底层原理全面解析
c++·windows
烟花落o2 小时前
C++ 从 C 到进阶 ②:引用、inline 、nullptr
c++·引用·inline·nullptr·c++入门
liulilittle2 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光2 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
菜哥万岁万岁万万岁3 小时前
Visual Studio 2022 社区版下载
ide·visual studio
我不会插花弄玉4 小时前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl
hold?fish:palm4 小时前
20 旋转图像
c++·算法·leetcode
iCxhust5 小时前
8088单板机VScode集成开发环境使用方法
ide·笔记·vscode·编辑器·微机原理·8088单板机