您好,我在一个小项目中需要阅读.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::string
和std::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++项目(或程序(设置,并检查是否可以在那里设置输出代码页。(我不使用它,所以不知道它是否可能(。