malworm
@malworm

Как лечить char warning overflow при считывании с файла?

Здравствуйте, при сборке кода (под Ubuntu) выдает warning, он вроде не влияет на работу программы, но же хотелось бы устранить.
Имеется код

#include<iostream>
#include<fstream>
#include<iomanip>
#include <cstring>

using namespace std;
//--------------------------------------------------------------------------------
struct SBooks
{
	char chAuthorname[100],chAuthorpatronimic[100], chBook[100];
	int nYear, nPages, nPrise;
};
//--------------------------------------------------------------------------------
struct list
{
	SBooks sBooks;
	list* pNext;
};


когда считываю с файла
ifstream fin(g_chNameOfFile);
		if (!fin)
		{
			cout << "File doesn't exist." << endl;
			Readbooks();
			return;
		}
		list* pRun = g_pBegin;
		while (!fin.eof())
		{
			fin >> pRun->sBooks.chAuthorname >> pRun->sBooks.chAuthorpatronimic;
			fin.getline(pRun->sBooks.chBook, 99, '»');
			strcat(pRun->sBooks.chBook, "»");
			fin>> pRun->sBooks.nYear >> pRun->sBooks.nPages >> pRun->sBooks.nPrise;
			if (fin.eof())
				pRun->pNext = NULL;
			else
				pRun = pRun->pNext = new list;
		}

Geany выдает
struct.cxx: In function ‘void Readbooks()’:
struct.cxx:79:51: warning: overflow in implicit constant conversion [-Woverflow]
fin.getline(pRun->sBooks.chBook, 99, '»');

Подскажите, пожалуйста, решение
  • Вопрос задан
  • 722 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
fin.getline(pRun->sBooks.chBook, 99, static_cast<char>('»'));


Всё у вас правильно. А в Си char почему-то (обычно) знаковый.
Ответ написан
@MiiNiPaa
Вполне возможно, что '»' на самом деле не чар, а int. Гуглите multicharacter literals. Зависит это от кодировки файла и IDE. Попробуйте сделать так и запостить резултат:

#include <iostream>
#include <type_traits>

int main()
{
    std::cout << typeid('»').name() << '\n';
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы