在 C++ 中显示来自 .dat 文件的数据时出现奇怪的字符

Weird character when displaying data from .dat file in c++

我有一个 ipk.dat 文件,其中包含用分号分隔的学生姓名和他们的 GPA。我试图显示 GPA 大于 3 的学生的姓名,但我在控制台中得到了这样的奇怪字符的输出。

Hidayat Sari            3.60 
Susila Buana            3.27 
Krisna Sari             3.66 
Taufik Fatimah          3.38 
Bachtiar Darma          3.70 
Yohanes Anwar           3.93 
Harun Ratna             3.48 
Mega Zulfikar           3.32 
Zulfikar Abdul          3.50 
Rahman Nirmala          3.37 
Amir Cinta              3.30 
Firdaus Latifah         3.16 
Annisa Ali              3.65 
Eka Yuliana             3.14

这是我的代码:

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main() {
    ifstream inGPA;
    string studentGPA;
    string studentName;
    inGPA.open("ipk.dat");

    if (inGPA.is_open()) {
        string line;
        while (getline(inGPA, line)) {
            stringstream ss(line);
            getline(ss, studentName, ';');
            getline(ss, studentGPA);

            if ( stod(studentGPA) >= 3.0) {
                cout << studentName << "     \t" << studentGPA << endl;
            }
        }
    }
    return 0;
}

而这里面的ipk.dat file.The这个文件的编码是UTF-8.

如何解决这个奇怪的字符问题?

既然你已经解决了你的问题(这似乎与输入文件有关,而不是与程序有关),我想提出对 ͟r͟e͟m͟o͟v͟e͟ ͟t͟h͟e͟ ͟r͟e͟d͟u͟n͟d͟a͟n͟c͟i͟e͟s͟ 的一项修改。特别是,您不需要

//no need for these three statements
stringstream ss(line);
getline(ss, studentName, ';');
getline(ss, studentGPA);

在你的程序中。相反,您可以直接在 studentNamestudentGPA 上使用 getline,如下所示。

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main() {
    ifstream inGPA;
    string studentGPA;
    string studentName;
    inGPA.open("input.txt");

    if (inGPA.is_open()) {
        string line;
        //just getline directly into variables studentName and studentGPA
        while (getline(inGPA, studentName, ';'), getline(inGPA, studentGPA)) {

            if ( stod(studentGPA) >= 3.0) {
                cout << studentName << "     \t" << studentGPA << endl;
            }
        }
    }
    return 0;
}

不间断的 space 可能是不需要的输入,但如果您的名称包含非 ASCII 字符,也会遇到同样的问题。

这里的部分问题是您的终端不知道您正在发送 UTF-8 编码的字符。

如果你在Windows可以参考
基本思路是先设置终端理解UTF-8:

#include <Windows.h>

int main() {
    SetConsoleOutputCP(CP_UTF8); // set output to UTF-8
    // your code
}

这将正常打印不间断的 space 个字符。

注意:此更改不仅持续执行您的程序。
如果你 运行 在你的固定程序之后你的未固定程序,该程序似乎可以工作,直到你 运行 它在一个新的终端中。