Hỏi về exception "Debug Assertion Failure" trong code

Em vẫn là newbie nên ko biết tại sao code mình lại bị exception ạ
Đây là code của em:

#include <iostream>
#include <fstream>
#include <string>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <codecvt>
#include <locale>
#pragma warning (disable:4996)
using namespace std;

int wmain() {
	wofstream VNo ("VN.txt", ios::app);
	int ngu, dumb;
	ngu = _setmode(_fileno(stdin), _O_WTEXT);
	dumb =_setmode(_fileno(stdout), _O_WTEXT);
	locale loc(locale(), new codecvt_utf8<wchar_t>);
	wifstream out(L"VN.txt");
	wifstream ENi(L"EN.txt", ios::in);
	wofstream ENo(L"EN.txt", ios::app);
	wifstream ENi2(L"EN2.txt", ios::in);
	wofstream ENo2(L"EN2.txt", ios::app);
	wfstream so(L"Num.txt", ios::in);
	int num;
	so >> num;
	so.close();
	wofstream so2(L"Num.txt");
	int quit = 0;
	wstring EN;
	wstring VN;
	VNo.imbue(loc);
	while (quit != 5) {
		wcout << L"Pick a number:" << endl;
		wcout << L"1. Add a word" << endl;
		wcout << L"2. Translate a word using data from this program" << endl;
		wcout << L"3. Add the missing meaning for a word" << endl;
		wcout << L"4. Test your memory with random words from this dictionary" << endl;
		wcout << L"5. Exit" << endl;
		wcin >> quit;
		wcin.ignore(numeric_limits<streamsize>::max(), '\n');
		switch (quit) {
		case 1: {
			wcout << L"Please type the word you want to add:" << endl;
			getline(wcin, EN);
			num++;
			wcout << L"Please type its meaning, if you have no idea, please type 'idk'" << endl;
			getline(wcin, VN);
			if (VN != L"idk") {
				ENo << EN << endl;
				VNo << VN << endl;
			}
			else {
				ENo2 << EN << endl;
			}
			ENi.seekg(ios::beg);
			ENi2.seekg(ios::beg);
			ENo.seekp(ios::beg);
			ENo2.seekp(ios::beg);
			break;
		}
		case 2: {
			wcout << L"What word would you like to translate?" << endl;
			getline(wcin, EN);
			wstring EN2;
			wstring VN2;
			int check = 0;
			while (!ENi.eof()) {
				ENi >> EN2;
				out.imbue(loc);	//đọc TV
				getline(out, VN2);
				if (EN2 == EN) {
					check = 1;
					break;
				}
			}
			if (check == 1)
				wcout << L"According to this dictionary, the meaning of this word is: " << VN2 << endl;
			if (check == 0) {
				int mode;
				wcout << L"This word haven't been added to your dictionary yet" << endl;
				wcout << L"Add it now?" << endl;
				wcout << L"1. Yes" << endl << L"2. No" << endl;
				wcin >> mode;
				switch (mode) {
				case 1: {
					ENo << EN;
					wcout << L"Please type its meaning, if you have no idea, please type 'idk'" << endl;
					getline(wcin, VN);
					if (VN != L"idk") {
						ENo << EN << endl;
						VNo << VN << endl;
					}
					else {
						ENo2 << EN << endl;
					}
				}
				case 2: {
					break;
				}
				}
			}
			ENi.seekg(ios::beg);
			ENi2.seekg(ios::beg);
			ENo.seekp(ios::beg);
			ENo2.seekp(ios::beg);
			break;
		}
		case 3: {
			ENi2.seekg(ios::beg);
			wcout << L"Preparing..." << endl << L"Please wait..." << endl;
			wstring EN2;
			wstring VN2;
			int check = 0;
			int dem = 0;
			if (ENi2.end) {// kiếm cách đi
				wcout << L"There's no words without meanings in your dictionary" << endl;
				break;
			}
			else {
				while (!ENi2.eof()) {
					ENi2 >> EN2;
					dem++;
				}
				wstring** idk = new wstring * [dem];
				for (int i = 0; i < dem; i++) {
					idk[i] = new wstring;
				}
				if (dem != 0) {
					ENi2.seekg(ios::beg);
					dem = 0;
					while (!ENi2.eof()) {
						ENi2 >> idk[dem][0];
						dem++;
					}
				}
				wcout << L"Please add the meaning of these below words, if you still have no idea, please type 'idk'" << endl;
				for (int i = 0; i < dem; i++) {
					wcout << idk[i][0] << ":" << endl;
					getline(wcin, VN);
					if (VN != L"idk") {
						VNo << VN << endl;
						num++;
						ENo << idk[i][0];
						delete idk[i];
					}
				}
				wfstream ENo3(L"EN2.txt", ios::out);
				for (int i = 0; i < dem; i++) {
					ENo3 << idk[i][0];
				}
			}
			ENi.seekg(ios::beg);
			ENi2.seekg(ios::beg);
			ENo.seekp(ios::beg);
			ENo2.seekp(ios::beg);
			break;
		}
		case 4: {
			wcout << L"This feature will be available in the next update";
			break;
		}
		default: {
			break;
		}
		}
	}
	so2 << num;
	return 0;
}

Ý tưởng của em là lm 1 app để nhập và dịch các từ tiếng anh và nghĩa của nó vào các file “EN.txt” và “VN.txt” và có thể bổ sung nghĩa cho các từ tiếng anh người dùng tạm thời chưa biết nghĩa. Vì cần phải nhập xuất được tiếng việt nên em có lên mạng tìm hiểu và biết cách dùng header codecvt. Sau khi em code xong thì VS 2019 của em không báo lỗi hay warning gì, nhưng khi bắt đầu Debug thì bị như này:
Debug
Do là newbie nên em thật sự không biết phần nào bị lỗi, mong các tiền bối hãy chỉ giáo ạ

Đây là các header em sử dụng ạ:
headers

code C++ thì xài fstream, ko nên xài lẫn lộn với FILE* của C
nếu đã xài wcout rồi thì ko được xài cout nữa. Xài wstring thì ko xài string nữa, wofstream thì ko xài ofstream nữa v.v…

4 Likes

đa tạ tiền bối, code em chạy đc r nma hàm getline lại không chạy được ạ. em sử dụng cả FILE* vs cả fstream 1 lúc là để viết được tiếng việt vào file nên h em cx ko bt sửa sao ạ

xài wcin luôn chứ ko xài cin nữa :V

2 Likes

wcin đâu lấy được nguyên dòng anh

std::getline(std::wcin, line) là được mà

trong file này có ví dụ hết nè :V đừng xài FILE* nữa

2 Likes

em đã sửa đúng theo những j anh ns, nhưng mà image
tại sao dòng getline đầu thì ko chạy được còn dòng getline thứ 2 thì chạy đc z anh

à chắc là do ở trên có xài wcin >> hả :V >> nó ko consume ký tự xuống dòng lúc gõ vào nên dòng getline thứ 1 liền sau đó nó đọc vào ký tự xuống dòng đó nên thành ra ko có gì :V

ví dụ code là

wcin >> quit
getline(wcin 
getline(wcin
...

và input là
1\nline one\ndòng một\n
thì wcin >> quit nó sẽ consume kí tự 1, input còn \nline one\ndòng một\n, dòng getline thứ nhất sẽ consume tới khi gặp kí tự \n thì dừng, nên nó đọc vào "", input còn line one\ndòng một\n, dòng getline thứ 2 sẽ đọc vào "line one", input còn dòng một\n :V

cách sửa là chèn thêm wcin.ignore(100, '\n') vào giữa >>getline

wcin >> quit
wcin.ignore(100, '\n')
getline(wcin
getline(wcin
...

hàm ignore(n, ch) nó bỏ qua tối đa n ký tự hoặc tới khi gặp ký tự ch thì dừng. wcin.ignore(100, '\n') là bỏ qua tối đa 100 ký tự hoặc tới khi nào gặp kí tự xuống dòng \n thì dừng. Magic number 100 ở đây là hy vọng khi nhập wcin >> input người dùng ko nhập vào 1 kèm theo 101 kí tự khoảng trắng sau đó :V :V nếu người ta nhập 101 khoảng trắng sau đó thì lại bị lỗi getline thứ nhất đọc vào 1 khoảng trắng chứ ko đọc dòng input sau đó :V muốn bảo đảm 100% thì phải gõ wcin.ignore(numeric_limits<streamsize>::max(), '\n') nhưng mà dài quá nên thôi để 100 được rồi :V

3 Likes

đa tạ tiền bối, 100% code của em đã chạy đc r, tiền bối cho em xin in4 có đc ko ạ :smiley:
nhưng khi chạy file release không dùng VS thì lại không nhập tiếng việt được. bây h fix sao đây ạ

đổi font của console thành Consolas đi

font mặc định của nó đá là consolas r anh

vậy thử copy dòng tiếng Việt rồi paste vào console xem được ko :V Gõ dòng tiếng Việt trong notepad, copy dòng đó vào rồi click chuột phải trong console để paste. Nếu được thì đổi app gõ tiếng việt đi, chắc là Unikey hả :V xài GoTiengViet đi :V

“không nhập được tiếng Việt” là sao, gõ ko ra/gõ xong mất chữ tiếng Việt hay gõ nó hiện ra được tiếng Việt nhưng enter xong chương trình in ra ko đúng?

4 Likes

là gõ ko ra tiếng việt đó anh
cách paste tiếng việt vào thì lại được anh ạ :))
xài gotiengviet là ok luôn anh

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