Ошибка при чтении файлов с собственным кодом на Windows Mobile - PullRequest
1 голос
/ 16 ноября 2009

Я новичок здесь, и мой английский не очень хорош. Приносим извинения за доставленные неудобства!

Я программирую приложение для Windows Mobile с собственным кодом (MFC). Я пытаюсь открыть файл, и это сводит меня с ума. Я пытался открыть его тысячами разных способов ... И я действительно достигаю этого, но когда я пытаюсь прочитать (fread или getline), программа вылетает без объяснения причин:

The program 'x' finalize with code 0 (0x0)  

Метод GetLastError() в некоторых случаях возвращает 183.

Затем я поместил код, который использовал для открытия файла:

std::wifstream file(L"\\Archivos de programa\\Prog\\properties.ini");  
wchar_t lol[100];
if (file) {  
    if(!file.eof()) {             
        file.getline(lol,99);
    }  
}   

Он входит во все if, но getline падает.


FILE * lol = NULL;  
lol = _wfope n(ruta, L"rb");  
DWORD a = GetLastError();  
if ( lol != NULL )  
    return 1;  
else  
    return -1;  

Возвращает 1 (правильно), а после, в более поздней getline, хранит мусор в строке. Однако, это не терпит крах !!


fp.open (ruta, ifstream::in);  
if ( fp.is_open() ) {       
    return 1;  
}else{        
    return -1;  
}

Он входит в return 1, но при выполнении более позднего getline () вылетает.

Я отладил метод getline(), и он зависает в библиотеке fstream, прямо здесь:

if ((_Meta = fget c (_File)) == EOF)  
    return (false);

В случае если. fgetc(), я полагаю.

Я схожу с ума !! Мне нужна подсказка, пожалуйста !!
Путь к файлу правильный. Во-первых, потому что, теоретически, методы открывают файл, а во-вторых, я получаю путь динамически, и он совпадает.

Подчеркните, что метод fread также дает сбой.

Заранее спасибо!

P.S:.
Скажем, что когда я делаю fopen, метод fp.good () возвращает мне FALSE, а GetLastError возвращает мне 183. С другой стороны, если я использую fp.fopen(path, ifstream::in); или std::wifstream fp(path);, fp.good(); возвращает мне TRUE и GetLastError() не выдает никакой ошибки (0).

Ответы [ 4 ]

0 голосов
/ 06 февраля 2010

Съемка в темноте тоже. Необъяснимый случайный сбой в MFC часто происходит из-за несоответствия прототипа обработчика сообщений. Например, следующий код неверен, но он не генерирует никаких предупреждений во время компиляции и может работать большую часть времени:

ON_MESSAGE(WM_LBUTTONDOWN, onClick)
...
void onClick(void)  //wrong prototype given the macro used (ON_MESSAGE)
{

//do some stuff 

}

Здесь прототип должен быть:

LRESULT onClick(WPARAM, LPARAM)
{
}

Часто бывает, когда люди достаточно уверенно начинают вручную изменять карты сообщений.

0 голосов
/ 16 ноября 2009

Я стреляю в темноте, но ваше описание звучит как история несоответствия времени выполнения. Убедитесь, что MFC и ваш проект используют одну и ту же модель ссылок времени выполнения (статическую / динамическую). Если вы связываетесь с MFC динамически, тогда ограничение более строгое: и MFC, и ваш проект должны использовать динамическое время выполнения.

0 голосов
/ 19 ноября 2009

Не знаю почему, но с классом CFile ... это работает ...

Тайны программирования!

0 голосов
/ 16 ноября 2009

Подсказка: используйте инструмент Process Monitor , чтобы узнать, что не так в вызовах файловой системы.

В пути, принятом wifstream, отсутствует диск ("C:" или подобное) (я не знаю, на что указывает переменная ruta)

Помимо самой проблемы с потоками, вы можете сэкономить много хлопот, используя GetProfileString и связанные с ними функции при использовании файла .ini Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...