Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > fwrite (struct->wchar_t)


Автор: CHITER 30.4.2010, 01:51
Код

struct DB_File {
    wchar_t DCity[20];
    wchar_t DCountry[20];
    wchar_t DCount[10];
    wchar_t DSize[10];
    wchar_t DYear[5];
    DB_File *next;
} File_Struct, *start, *end;


void CDialogAdd::OnBnClickedButton1() {
    CreateDirectory(L"DB_Files", NULL);
    FILE* myf;
    switch (ID_CONT) {
        case 0:
            myf = fopen("DB_Files\\Eurasia.dat", "a+");
            break;
        case 1:
            myf = _wfopen(L"DB_Files\\Asia.dat", L"a+");
            break;
        case 2:
            myf = _wfopen(L"DB_Files\\Africa.dat", L"a+");
            break;
        case 3:
            myf = _wfopen(L"DB_Files\\Australia.dat", L"a+");
            break;
        case 4:
            myf = _wfopen(L"DB_Files\\South_America.dat", L"a+");
            break;
        case 5:
            myf = _wfopen(L"DB_Files\\North_America.dat", L"a+");
            break;
    }
    int t = 0;
    ECity.GetWindowTextW(File_Struct.DCity, 20);
    ECountry.GetWindowTextW(File_Struct.DCountry, 20);
    ECount.GetWindowTextW(File_Struct.DCount, 10);
    ESize.GetWindowTextW(File_Struct.DSize, 10);
    EYear.GetWindowTextW(File_Struct.DYear, 5);
    t = fwrite(&File_Struct, sizeof(DB_File), 1, myf);
    fclose(myf);
    OnOK();
}

void CppcDlg::OnCbnSelendokCont()
{
    DB_File *curr = NULL;
    FILE* myf;
    LVITEM lvi;
    int i = 1;
    WCHAR buf[100];
    m_ListCtrl.DeleteAllItems();
    CreateDirectory(L"DB_Files", NULL);
    switch (MainCont.GetCurSel()) {
        case 0:
            if ((myf = _wfopen(L"DB_Files\\Eurasia.dat", L"r")) == NULL) return;
            break;
        case 1:
            if ((myf = _wfopen(L"DB_Files\\Asia.dat", L"r")) == NULL) return;
            break;
        case 2:
            if ((myf = _wfopen(L"DB_Files\\Africa.dat", L"r")) == NULL) return;
            break;
        case 3:
            if ((myf = _wfopen(L"DB_Files\\Australia.dat", L"r")) == NULL) return;
            break;
        case 4:
            if ((myf = _wfopen(L"DB_Files\\South_America.dat", L"r")) == NULL) return;
            break;
        case 5:
            if ((myf = _wfopen(L"DB_Files\\North_America.dat", L"r")) == NULL) return;
            break;
    }
    int t = 0;
    while (!feof(myf)) {
        t = fread(&File_Struct, sizeof(DB_File), 1, myf);
        curr = new DB_File();
        lvi.mask = LVIF_TEXT;
        lvi.iItem = i-1;
        lvi.iSubItem = 0;
        _itow(i, buf, 10);
        lvi.pszText = buf;
        m_ListCtrl.InsertItem(&lvi);
        lvi.iSubItem = 1;
        lvi.pszText = File_Struct.DCity;
        m_ListCtrl.SetItem(&lvi);
        lvi.iSubItem = 2;
        lvi.pszText = File_Struct.DCountry;
        m_ListCtrl.SetItem(&lvi);
        lvi.iSubItem = 3;
        lvi.pszText = File_Struct.DCount;
        m_ListCtrl.SetItem(&lvi);
        lvi.iSubItem = 4;
        lvi.pszText = File_Struct.DSize;
        m_ListCtrl.SetItem(&lvi);
        lvi.iSubItem = 5;
        lvi.pszText = File_Struct.DYear;
        m_ListCtrl.SetItem(&lvi);
        i++;
        wcscpy(curr->DCity, File_Struct.DCity);
        wcscpy(curr->DCount, File_Struct.DCount);
        wcscpy(curr->DCountry, File_Struct.DCountry);
        wcscpy(curr->DSize, File_Struct.DSize);
        wcscpy(curr->DYear, File_Struct.DYear);
        if (start == NULL) {
            start = curr;
            end = curr;
            end->next = NULL;
        } else {
            end->next = curr;
            end = curr;
            end->next = NULL;
        }
    }
    fclose(myf);
}


Суть в том, что при дебаге просматриваю всю структуру, перед тем как выполнится fwrite, все ровно, все нормально.
При выводе первый блок из файла ровно выходит, но дальше, все либо пусто, либо какими-то клочками от записанных строк.
В чем может крыться проблема ?

Автор: KOHCEPBATOP 30.4.2010, 08:05
CHITER, при работе с функциями fread и fwrite файл нужно открывать в бинарном режиме:
myf = fopen("DB_Files\\Eurasia.dat", "a+b"); и myf = _wfopen(L"DB_Files\\Eurasia.dat", L"rb")



P.S.
Вместо switch обычно используются другие конструкции. Например массивы:
Код

static const wchar_t * FileNameList[] = {
    L"DB_Files\\Eurasia.dat",
    L"DB_Files\\Asia.dat",
    L"DB_Files\\Africa.dat",
    L"DB_Files\\Australia.dat",
    L"DB_Files\\South_America.dat",
    L"DB_Files\\North_America.dat"
 };
 FILE* myf;
 int i = MainCont.GetCurSel();
 if( (i < 0) || (i >= sizeof(FileNameList)/sizeof(FileNameList[0])) ) return;
 myf = _wfopen( FileNameList[i], L"rb" );
 if( myf == NULL ) return;

Автор: CHITER 30.4.2010, 22:06
решено...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)