Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Искажение данных

78K
31 января 2012 года
Alek231
6 / / 31.01.2012
Здравствуйте уважаемые участники. Не подскажите как можно исправить следующую проблему.

Вообщем данный участок кода ищет в каталоге файлы с форматам format - в основном это ".doc || .exl". Когда файл найден с него считываются данные (т.е имя, вес, дата создания и т.д) после этого полученная информация записывается в файл PathName.

Так вот самый первый найденный файл записывается нормально, а последующая информация
об остальных файлах частично искажена.

Большое спасибо.

Код:
int CmyLabTwoDlg::FindFileWriteInBase(CString PathFile,CString format) //Ищет в катологе файлы формата "format"
{
        UpdateData(true); // Копируем данные из элем. управление в связанные сним переменные
    ListFiles.RemoveAllGroups();

    CStdioFile fout(PathFile, CFile::modeWrite);
   
    WIN32_FIND_DATA FindFileData; // Содержит информацию о файле
    HANDLE hFind=NULL; // Дескриптр  на фаил

    hFind=FindFirstFile(m_PathFolder+"\\"+format, &FindFileData); // Ищем файлы фармата ".doc || .exl"

    if(hFind!=INVALID_HANDLE_VALUE)
    {
        do
        {
            fout.WriteString(FindFileData.cFileName); // Добавляет имя файла в базу, т.е в файл "base.txt"
            fout.WriteString(L"\n" + myConvertSize(FindFileData) + "\n"); // Добавляет размер файла, низкого порядка DWORD
           
            CString b=m_PathFolder+"\\"+FindFileData.cFileName; //Полный путь к найденному файлу
           
            fout.WriteString(myGetChangeFileTime(b)+"\n"); // Добавляет время изменения файла.
            fout.WriteString(AttributesFile(FindFileData.dwFileAttributes)+"\n"); // Добавляет инф. об атрибутах
            fout.WriteString(b+"\n"); //Добавляем полный путь к файлу
           
        }while(FindNextFile(hFind, &FindFileData) != 0);
       
        FindClose(hFind);
        fout.Close();

        return 1;
    }
return 0;
}.


Результат:
Doc1.doc
21
26.1.2012
Archive
C:\Users\Al\Desktop\1\Doc1.doc

Do
35
26.1.2012
Archive
C:\Users\Al\Desktop\1\DoDo
76
30.1.2012
Archive
C:\Users\Al\Desktop\1\DoDo
68
30.1.2012
Archive
C:\Users\Al\Desktop\1\Do
277
01 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Вроде всё правильно в коде.

Попробуй пример с msdn запустить и посмотреть на результат.
20K
01 февраля 2012 года
sem2711
124 / / 23.09.2009
А что содержится в переменной format? Что за формат файла .exl? Может .xls имели ввиду?
78K
01 февраля 2012 года
Alek231
6 / / 31.01.2012
Цитата: sem2711
А что содержится в переменной format? Что за формат файла .exl? Может .xls имели ввиду?


В этой переменной содержится форматы файлов. Например format="*.doc".
sem2711 вы правы, я малость переборщил.


Цитата: arrjj
Вроде всё правильно в коде.

Попробуй пример с msdn запустить и посмотреть на результат.


Большое спасибо. Сейчас попробую что нибудь предпринять.

Может быть данная проблема возникает из за переполнения? Спасибо.

Цитата:
MSDN: WriteString throws an exception in response to several conditions, including the disk-full condition.



Спасибо.

78K
02 февраля 2012 года
Alek231
6 / / 31.01.2012
Здравствуйте еще раз.
Уважаемый arrjj благодарю вас за частичную помощь.
И все же проблему не удалось решить до конца.
В предыдущей работе тоже использовал класс СStdioFile только все работало нормально, за исключением если в переменной(объекте) типа СString содержалась кириллица(т.е русские букафки).

Вот эта часть:
 
Код:
CStdioFile File(PathName, CFile::modeCreate|CFile::modeWrite);

      for(int i=0; i<NumberElements; i++)
      {
          for(int j=0; j<2; j++)
          {
              CString ListNameFile=ListFiles.GetItemText(i,j)+"\n";
              File.WriteString((LPCTSTR)ListNameFile);
          }
       }

Спасибо.
277
02 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Какая кодировка проекта?
Почему не отказаться от CStdioFile в пользу каких-нибудь других методов i/o.
Попробуй выставить другую кодировку через setlocale().
78K
02 февраля 2012 года
Alek231
6 / / 31.01.2012
Используется unicod, также используется DLL.
277
02 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Насколько знаю CStdioFile работает с ascii, попробуй сначала через WideCharToMultiByte перекодировать строку.
78K
02 февраля 2012 года
Alek231
6 / / 31.01.2012
Спасибо большое. Проблема разрешена.
Решение: setlocale(LC_ALL, "English");
78K
08 февраля 2012 года
Alek231
6 / / 31.01.2012
Снова столкнулся с этой же проблемой, но setlocale уже не помогает.

Вот новое решение:
Цитата:
void WriteString(CFile &fr, const CString& str)
{
char *tmp = NULL;
BOOL change = FALSE;

int size = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, "?", &change); //Возвратить размер буфера в байтах

tmp = new char[size+1](); // Выделить "size+1" ячеёк памяти символьного типа и инициализировать их пустым значением

WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), tmp, size+1, "?", &change); // Преобразовать строку СString в строку символов,
//т.е char'ов

fr.Write(tmp, size); // Записать в базу
delete [] tmp;

const char crlf[] = "\r\n"; // Возвращаем каретку в начало строки и переходим на новую строку
fr.Write(crlf, strlen(crlf));

}

277
08 февраля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Alek231
Снова столкнулся с этой же проблемой, но setlocale уже не помогает.

Вот новое решение:



Что такое fr?


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог