C++ 使用C++;

C++ 使用C++;,c++,text,C++,Text,我有一个文本文件,我正在向其中添加标记,以使其具有XML可读性。为了让我们的读者识别它是有效的,每一行至少必须用标签包装。我的问题产生了,因为这实际上是一本叙利亚语翻译词典,因此有许多非标准字符(实际的叙利亚语单词)。我所看到的实现我所需要的最直接的方法就是简单地在每一行的前面加上所需的标记,而不必访问或修改行的其余部分。任何其他选择也将不胜感激 ifstream in_file; string file_name; string line; string line2; string pre_

我有一个文本文件,我正在向其中添加标记,以使其具有XML可读性。为了让我们的读者识别它是有效的,每一行至少必须用标签包装。我的问题产生了,因为这实际上是一本叙利亚语翻译词典,因此有许多非标准字符(实际的叙利亚语单词)。我所看到的实现我所需要的最直接的方法就是简单地在每一行的前面加上所需的标记,而不必访问或修改行的其余部分。任何其他选择也将不胜感激

ifstream in_file;
string file_name;

string line;
string line2;
string pre_text;
string post_text;

int num = 1;

pre_text = "<entry n=\"";
post_text = "</entry>";

file_name = "D:/TEI/dictionary1.txt";
in_file.open(file_name.c_str());

if (in_file.is_open()){
    while (getline(in_file, line)){
        line2 = pre_text + to_string(num) + "\">" + line + post_text;
        cout << line2;
        num++;
    }
}
_文件中的
ifstream;
字符串文件名;
弦线;
弦线2;
字符串前置文本;
字符串post_文本;
int num=1;
pre_text=”“+行+post_文本;

cout您正在使用默认情况下处理ASCII编码文本的
std::string
,并且您正在以“文本翻译模式”打开文件。您需要做的第一件事是以二进制模式打开文件,这样它就不会对单个
char
值执行转换:

in_file.open(file_name.c_str(), std::ios::binary);
或者在C++11中

in_file.open(file_name, std::ios::binary);
下一件事是停止使用std::string来存储文件中的文本。您需要为我们提供一个字符串类型,该类型可以识别您正在使用的字符编码,并使用适当的字符类型

事实证明,
std::string
实际上是
std::basic_string
的别名。在C++11中引入了几种新的unicode字符类型,在C++03中有支持“宽”字符(超过8位)的
wchar\u t
wchar\u t
s的
basic\u string
s有一个标准别名:
std::wstring

从以下简单测试开始:

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

int main() {
    std::string file_name = "D:/TEI/dictionary1.txt";
    std::wifstream in_file(file_name, std::ios::binary);

    if (!in_file.is_open()) {
        // "L" prefix indicates a wide string literal
        std::wcerr << L"file open failed\n";
        return 1;
    }

    std::wstring line1;
    std::getline(in_file, line1);
    std::wcout << L"line1 = " << line1 << L"\n";
}
#包括
#包括
#包括
int main(){
std::string file_name=“D:/TEI/dictionary1.txt”;
文件中的std::wifstream(文件名,std::ios::binary);
如果(!in_file.is_open()){
//“L”前缀表示宽字符串文字

STR::WCSER考虑在Unicode中运行文件IO。为您节省大量的痛苦。特别注意提防点3。而不是使用+运算符附加到字符串中,考虑使用A。它应该更快,并最终切换到输出文件CAKEKFACE。记住不要在现有文件上输出,始终输出到新文件,然后重命名。我的问题是,当编译器读取该行时,它会混淆所有叙利亚文(阿拉姆字体)文本。该行可能重复,并且该行
std::getline(在_文件中,第1行);
抛出错误“重载函数'std::getline'的实例与参数列表不匹配。参数类型包括:(std::ifstream,std::wstring)”