MFC сериализует C

#c #serialization #mfc

Вопрос:

Я пытаюсь сериализовать список в MFC.

Я использовал этот код :

 CFileDialog fileDlg(FALSE, _T(".txt"), NULL, 0, _T("Text File (.txt)|*.txt|")
        _T("All files (*.*)|*.*||"));

    if (fileDlg.DoModal() == IDOK)
    {
        const int numItems = m_listBox.GetCount();
        CString itemText;
        CStdioFile file;

        if (file.Open(fileDlg.GetFileName(), CStdioFile::modeCreate | CStdioFile::modeWrite))
        {
            for (int i = 0; i < numItems;   i)
            {
                m_listBox.GetText(i, itemText);
                file.WriteString(itemText);
                file.WriteString(_T("n"));
            }

            file.Close();
        }
 

Но сохраненный файл всегда пуст.
Я перепробовал множество версий функций, которые сохраняются из списка в текстовый файл, но это не сработало.

Комментарии:

1. И когда вы использовали свой отладчик для пошагового выполнения показанного кода, по одной строке за раз, и проверки значений всех переменных на каждом шаге, что вы увидели?

2. Я не могу работать с отладчиком шаг за шагом в проекте MFC (точка останова или f11 просто «сбрасывают» меня во время выполнения)

3. Вам нужно будет выяснить, как отлаживать показанный код. Знание того, как эффективно использовать отладчик, является обязательным навыком для каждого разработчика C . Прежде чем задавать вопросы о Stackoverflow, каждый должен попытаться отладить свой собственный код и включить свои наблюдения в свой вопрос.

4. Вы можете использовать метод грубой силы «printf» для отладки, если у вас нет полезного отладчика. Это означало бы сделать AfxMessageBox() вызов для отображения вещей. Для начала я бы проверил, что numItems значение не равно 0. Я сомневаюсь, что проблема в механизме написания файла [который вы нам показали], но в m_listBox коде, который вы нам не показали.

5. Visual Studio обладает первоклассной отладкой. Я делаю это уже более 20 лет, и это просто работает (большую часть времени 🙂 Установите точку останова сначала if в вашем коде, а затем в коде F10.

Ответ №1:

В вашем коде, который вы используете CFileDialog::GetFileName . Это намеренно? Это будет передано только в имени файла.

Я бы использовал CFileDialog::GetPathName , который возвращает полный путь к файлу.

И вы должны использовать отладчик (компилировать в режиме отладки), чтобы вы могли просматривать свой код.

CStdioFile::Open Метод также может быть передан как указатель на объект исключения. Взгляните на справку.