c++用重音符号读取文件



您好,我在一个小项目中需要阅读.txt文件,问题是有些文件是英文的,另一些是西班牙文的,在这种情况下,一些信息带有重音,我必须在控制台上用重音显示。

我用setlocale(LC_CTYPE, "C");在控制台上显示重音没有问题

我的问题是,在读取.txt文件时,它不会检测到重音符号,并读取罕见字符。

我的练习代码是:

#include <iostream>
#include <locale.h>
#include<fstream>
#include<string>
using namespace std;
int main(){

setlocale (LC_CTYPE, "C");
ifstream file;
string text;

file.open("entryDisciplineESP.txt",ios::in);

if (file.fail()){

cout<<"The file could not be opened."<<endl;

exit(1); 

}

while(!file.eof()){ 
getline(file,text);

cout<<text<<endl;

}

cout<<endl;

system("Pause");
return 0;
}

有问题的.txt文件包含:

Inicio
D1
Biatlón
S1
255
E1
Esprint 7,5 km (M); 100; 200
E2
Persecucion 10 km (M); 100; 200
ff

很明显,我对"ó"有问题,但同样,我也有其他带有重音的.txt字符,所以我需要一个解决所有这些字符的方案。

在研究中,我阅读并尝试实现wstring和wifstream,但我一直未能成功实现。

我正试图在windows上实现这一点,就像我需要在linux上工作的解决方案一样,目前我正在使用dev c++5.11

提前非常感谢您的时间和帮助。

您的错误在于如何控制读取循环。请参阅:为什么!。循环条件中的eof((总是错误的。相反,使用读取函数返回的流状态来控制读取循环,例如

while (getline(file,text)) {

std::cout << text << 'n';

}

所讨论的字符是简单的扩展ASCII(例如c3(,并且很容易在std::stringstd::cout中表示。您的完整示例,修复为什么"使用命名空间std;"被认为是错误的做法?将是

#include <iostream>
#include <fstream>
#include <string>
int main() {

setlocale (LC_CTYPE, "C");
std::ifstream file;
std::string text;

file.open ("entryDisciplineESP.txt");

if (file.fail()){

std::cerr << "The file could not be opened.n";

exit(1); 
}

while (getline(file,text)) {

std::cout << text << 'n';
}

std::cout.put('n');

#ifdef _WIN32
system("Pause");
#endif
return 0;
}

示例输出

$ ./bin/accent_read
Inicio
D1
Biatlón
S1
255
E1
Esprint 7,5 km (M); 100; 200
E2
Persecucion 10 km (M); 100; 200
ff

Windows 10使用UTF-8代码页

尝试在Windows 10控制台下运行上述代码时遇到的问题(我认为这就是DevC++启动输出的地方(是,默认代码页(437 - OEM United States(不支持UTF-8字符。要将代码页更改为UTF-8,您将使用(65001 - Unicode (UTF-8)(。参见代码页标识符

在使用C++17语言标准在VS下编译后,要获得正确的输出,所需要的只是在控制台中使用chcp 65001更改代码页。(您还必须有UTF-8字体,我的字体设置为Lucida Console(

设置代码页后在Windows控制台(命令提示符(中输出

C:Usersdavidsourcereposaccents>chcp 65001
Active code page: 65001
C:Usersdavidsourcereposaccents>Debugaccents.exe
Inicio
D1
Biatlón
S1
255
E1
Esprint 7,5 km (M); 100; 200
E2
Persecucion 10 km (M); 100; 200
ff
Press any key to continue . . .

由于DevC++自动启动控制台,您还需要以编程方式设置代码页。您可以使用SetConsoleOutputCP (65001)来完成此操作。例如:

...
#include <windows.h>
...
#define CP_UTF8 65001 
int main () {
// setlocale (LC_CTYPE, "C");           /* not needed */

/* set console output codepage to UTF-8 */
if (!SetConsoleOutputCP(CP_UTF8)) {
std::cerr << "error: unable to set UTF-8 codepage.n";
return 1;
}
...

请参阅SetConsoleOutputCP函数。用于设置输入代码页的类似功能是SetConsoleCP(uint codepage)

使用SetConsoleOutputCP((输出

将控制台设置为默认的437代码页,然后使用SetConsoleOutputCP (65001)将输出代码页设置为UTF-8,您会得到相同的结果,例如

C:Usersdavidsourcereposaccents>chcp 437
Active code page: 437
C:Usersdavidsourcereposaccents>Debugaccents.exe
Inicio
D1
Biatlón
S1
255
E1
Esprint 7,5 km (M); 100; 200
E2
Persecucion 10 km (M); 100; 200
ff
Press any key to continue . . .

此外,检查DevC++项目(或程序(设置,并检查是否可以在那里设置输出代码页。(我不使用它,所以不知道它是否可能(。

最新更新