从文件中读取时无法识别的字符

时间:2018-02-26 09:26:43

标签: c++ visual-studio encoding ifstream

我在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要么失败,要么问题仍然存在。我错过了哪些细节?

2 个答案:

答案 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(&currentChar, 1))

另外,请务必通过argv[1]。打印其值:

cout<<argv[1]<<endl;