我在visual studio中有以下c ++代码来读取文件中的字符。
ifstream infile;
infile.open(argv[1]);
if (infile.fail()) {
cout << "Error reading from file: " << strerror(errno) << endl;
cout << argv[0] << endl;
}
else {
char currentChar;
while (infile.get(currentChar)) {
cout << currentChar << " " << int(currentChar) << endl;
//... do something with currentChar
}
ofstream outfile("output.txt");
outfile << /* output some text based on currentChar */;
}
infile.close();
这种情况下的文件应该包含大多数普通的ASCII字符,但有两个例外:“
和”
。
问题是它当前表单中的代码无法识别这些字符。 cout
字符输出垃圾,其int转换产生的负数根据文件在何处发生而不同。
我有一种预感,问题是编码,所以我试图根据互联网上的一些例子来灌输infile
,但我似乎没有把它弄好。到达引号字符时infile.get
要么失败,要么问题仍然存在。我错过了哪些细节?
答案 0 :(得分:2)
您尝试阅读的文件可能是UTF-8编码的。大多数字符读取正常的原因是因为UTF-8向后兼容ASCII。
为了阅读UTF-8文件,我将引用您:http://en.cppreference.com/w/cpp/locale/codecvt_utf8
#include <fstream>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
...
// Write file in UTF-8
std::wofstream wof;
wof.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t,0x10ffff,std::generate_header>));
wof.open(L"file.txt");
wof << L"This is a test.";
wof << L"This is another test.";
wof << L"\nThis is the final test.\n";
wof.close();
// Read file in UTF-8
std::wifstream wif(L"file.txt");
wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t,0x10ffff, std::consume_header>));
std::wstringstream wss;
wss << wif.rdbuf();
(来自here)
答案 1 :(得分:-2)
尝试:
while (infile.get(¤tChar, 1))
另外,请务必通过argv[1]
。打印其值:
cout<<argv[1]<<endl;