Cách nhập và xuất tiếng Việt có dấu trong C++

#include "stdafx.h"
#include<iostream>
#include<string>
#include<io.h>
#include<fcntl.h>
#include<Windows.h>

using namespace std;
class Students {
	int code;
	wstring fullname;
	wstring phonenumber;
	wstring birthday;
public:
	void getData();
	void setData();
};
void Students::setData() {
	wcout << L"Nhập mã sinh viên: ";
	cin >> code;
	wcout << L"Nhập tên sinh viên: ";
	getline(wcin >> ws, fullname);
	wcout << L"Nhập số điện thoại: ";
	getline(wcin>>ws, phonenumber);
	wcout << L"Nhập ngày sinh: ";
	getline(wcin >> ws, birthday);
}
void Students::getData() {
	wcout << L"Mã sinh viên: "<< code << endl;
	wcout << L"Họ tên: " << fullname << endl;
	wcout << L"Số điện thoại: " << phonenumber << endl;
	wcout << L"Ngày sinh: " << birthday << endl;
}

int main()
{	
	_setmode(_fileno(stdin), _O_U16TEXT);
	_setmode(_fileno(stdout), _O_U16TEXT);
	HANDLE hdlconsole = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFOEX consoleFont;
	consoleFont.cbSize = sizeof(consoleFont);
	GetCurrentConsoleFontEx(hdlconsole, FALSE, &consoleFont);
	memcpy(consoleFont.FaceName, L"Consolas", sizeof(consoleFont.FaceName));
	Students *sv = new Students;
	int n;
	wcout << L"Nhập số lượng sinh viên: "; cin >> n;
	for (int i = 0; i < n; i++) {
		wcout << L"Nhập thông tin sinh viên thứ " << i + 1 <<": "<< endl;
		sv->setData();
	}
	wcout << L"--------Danh sách sinh viên---------" << endl;
	for (int i = 0; i < n; i++) {
		sv->getData();
	}
	return 0;
}

Bạn đã chạy 2 lệnh này:

_setmode(_fileno(stdin), _O_U16TEXT);
_setmode(_fileno(stdout), _O_U16TEXT);

Thì cả chương trình, bắt buộc phải dùng wcoutwcin nhé

2 Likes

cảm ơn bạn mình sửa đc rồi. cho mình hỏi khi mình nhập gõ kiểu Telex nó ko đc @@

CMD Windows chỉ có GoTiengViet mới gõ được Tiếng Việt :laughing:

1 Like

wao, thank nhiều nhé, có gì không biết xin chỉ giáo thêm
lần đầu biết thêm cái lmgtfy này, hay quá
nó bị lỗi gì v bạn, mình mới #include thôi à

Qt cài vào Visual Studio khó lắm đấy, bạn lên mạng kiếm tut tích hợp vào VS 2015, hoặc xài luôn Qt Creator cho mau.

1 Like

à, ý là phải xài tool vào hả, vậy không được rồi, tại thầy mình bắt phải thao tác nhập xuất xử lý file với dữ liệu unicode, mà làm sao bắt ông thầy cài tool được
Bạn có cách nào khác không

Trên DNH có một bài: https://daynhauhoc.com/t/cach-d-c-va-ghi-file-unicode-c

1 Like

hay lắm, thank nhiều nhé bạn

Bạn cho mình hỏi, cái phần này trong code của bạn là đặt font hiển thị là consolas phải không ?

CONSOLE_FONT_INFOEX consoleFont;
consoleFont.cbSize = sizeof(consoleFont);
GetCurrentConsoleFontEx(hdlConsole, FALSE, &consoleFont);
memcpy(consoleFont.FaceName, L"Consolas", sizeof(consoleFont.FaceName));
SetCurrentConsoleFontEx(hdlConsole, FALSE, &consoleFont);

Và giải thích giúp mình luôn cái memcpy là gì, hàm, thủ tục ???
Giải thích rõ giúp mk, mình đang học Pascal nhưng mk có thể đọc đc code C++ được.

Thủ tục copy vùng nhớ đó bạn, gán cho nội dung của FaceName bằng L"Consolas".

1 Like

CONSOLE_FONT_INFOEX là 1 struct mà trong đó, member FaceName luôn là 1 mảng WCHAR, 32 phần tử.

memcpy(consoleFont.FaceName, L"Consolas", sizeof(consoleFont.FaceName));

memcpy là thủ tục copy vùng dữ liệu trong bộ nhớ, cái gì copy được là nó copy, nó copy theo số BYTE , L"Consolas" thực ra là pointer trỏ đến chuỗi đó (trong .rdata của app), sizeof(consoleFont.FaceName) là 64 (1 phần tử WCHAR là 2 byte), bạn phải học full cơ bản C/C++, hiểu được chính xác về bản chất C/C++ mới hiểu được, tham khảo: http://www.cplusplus.com/reference/cstring/memcpy/
P.S: thật sự là nên học C/C++ đi đôi với ASM.

2 Likes

Tuy có hơi lâu (2 năm chứ mấy) :slight_smile:. Nhưng mình cũng xin góp ý tý.
Bạn có thể dùng lệnh chuyển gói CHCP của console để viết tiếng Việt.
Cụ thể là :point_down:

#include <iostream>

int main() {
	system("chcp 65001");
	std::cout << "Việt Nam vô địch";
	return 0;
}

Hmm. . . sau một hồi nghiên cứu thì theo cách này mk thấy chỉ xuất được chứ chưa nhập đc, chắc lại phải làm theo Ngọc tỷ tỷ rồi. :blush:

:stuck_out_tongue_closed_eyes:

3 Likes

@MeigyokuThmn
làm sao để trở lại bình thường được vậy, nếu dùng thế thì ko dùng kiểu biến float đc??

mấy chú code thì comment cho người ta hiểu với

1 Like

Bạn giải thích code được không ?? Viết vậy không hiểu

mn ơi cho e hỏi với ạ
e gõ được tiếng việt nhưng khi chạy thì nó lại ra lỗi ngôn ngữ ạ
ai sửa giúp e với

tại sao mình chạy lại có lỗi này nhỉ “_O_U16TEXT’ was not declared in this scope”

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?