Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53

Некоторые проблемы с файлами

07.08.2011, 18:58. Показов 2983. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Категорически приветствую.
У меня возникла пара проблем с файлами. Я делаю лаунчер для одной программки (официальный лаунчер идет через браузер, что не есть хорошо для моего сервера) на консольке. Вроде все было нормально, до того как я решил сделать проверку на версию клиента.
В общем, сначала я хотел сделать при помощи сравнивания размеров файлов, но не где не смог найти внятной информации об этом.
Затем, я решил сделать инициализацию при помощи строки в файле конфигураций. Ну мол если она отсутствует, то спрашиваем у пользователя версию, ну а если есть уже эта строка, то уже читаем и сравниваем с актуальной версией. Тут я опять получил прокол. Читая несуществующую строку через fgets, я получаю "MMMMMMMMMMMMMxres 800", пытался сделать сравнение через stricmp (ибо другие способы мне неизвестны), но все равно проверка не проходила, и мой лаунчер считал что это и есть версия клиента. Пытался опять же найти информацию по этому поводу, и как-то не нашел.
Затем я решил сделать отдельный файл, в котором это будет хранится, но и тут я прокололся...
C++
1
2
3
4
5
6
7
8
9
10
file = fopen("тут как бы был путь к файлу","r");
if(file == 0) //Как я понял из найденой мною информации, fopen возврощает 0, если файла не существует.
{
cout << "тут собственно текст о просьбе указать версию";
cin >> input[0][0] //массив в котором хранятся и обрабатываются файлы клиента.
fclose(file); //на этом месте, в программе я получаю ошибку. Не совсем внятную. :)
file = fopen(file,"w"); 
fputs("0.54",file); //Для эксперемента удалял fclose, получал уже ошибку с этой функцией
fclose(file);
}
Собственно, тут я обессилил, и решил написать сюда.
Собственно вопросы:

1.Как правильно сравнивать 2 string именно на символы?
2.Как правильно проверять на отсутствие данных в строке файла?
3.Как правильно проверять на отсутствие файла?
4.Как правильно получать размер файла?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.08.2011, 18:58
Ответы с готовыми решениями:

Некоторые проблемы с монитором
Добрый вечер! Месяц назад купил монитор NEC MultiSync LCD 175M. Сразу скажу, что в работе, пока, нареканий особых нет. Но, беспокоят...

Утилита sfc не может исправить некоторые проблемы
Доброго времени суток, уважаемые форумчане. Сегодня установил &quot;народную&quot; версию gpedit.msc для Windows 7 x64 HomePremium (лицензия). К...

ASUS Zenbook UX32L появились некоторые проблемы
Здравствуйте! Ноутбук ASUS Zenbook UX32L Процессор - Intel Core Intel Core i5-4200U; Память - 8 Гб Видеокарта - Intel HD 4400;...

25
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.08.2011, 20:16
Это же С++, используй файловые потоки.

1. Вместо массивов символов используй std::string ( оператор == будет работать тогда)
2. Если ничего не считалось, то файл пуст
3. Если файл не открылся, то его нет (или использовать функции WinAPI)
4. Использовать функции WinAPI или переместить курсор в конец файла и запросить его положение (это если через потоки).
1
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
07.08.2011, 23:22  [ТС]
1. Вместо массивов символов используй std::string ( оператор == будет работать тогда)
По поводу sdt::string, у меня с ним возникли некоторые ошибки, которые я смог решить перейдя на Char массив. А именно VS начал жаловаться на переменную в функциях fgets и им подобных.
Если ничего не считалось, то файл пуст
Весьма логично, я бы так и поступил, если бы мне чтение пустой строки не возврощало "MMMMMMMMMMMMMxres 800", как я уже об этом говорил.
3. Если файл не открылся, то его нет (или использовать функции WinAPI)
Дак вот как проверить, открылся ли он, или нет?
Хотя я из другого источника увидел пример, в котором было показано, что если файл не открылся, в переменную не чего не записывается, то есть она равна NULL. Пока не успел проверить.
4. Использовать функции WinAPI или переместить курсор в конец файла и запросить его положение (это если через потоки).
Тут по истине хороший совет. Я все еще пытался найти решение своих проблем в поске, и наткнулся на библиотеку windows.h. Это действительно прекрасно! Правда у меня и там проблема возникла, почему-то VS жалуется на введенное мною имя файла - HANDLE cfile = FindFirstFile("client.exe",&Data); Говорит что Char не есть хорошо для данной функции. Ищу ответ в поиске, но если кто-то поможет, тоже буду рад.
Собственно, если я решу проблему с этой функцией, возможно получится нормально перейти на string. Хотя интересно, можно ли конвертировать Char массив в string? Надо по искать, по пробывать.

Спасибо за ответ.

Добавлено через 46 минут
По поводу FindFirstFile уже решил проблему. По идее теперь я могу сделать проверку на версию, но надеюсь мне помогут с остальным, ибо это тоже важно.

Добавлено через 8 минут
Хо-хо-хо, мне эта функция выдает один и тот же размер на 2 разных файла.

C++
1
2
3
4
5
6
    WIN32_FIND_DATA Data;
    HANDLE cfile = FindFirstFile(LPCWSTR("client.exe"),&Data);
    DWORD size;
    GetFileSize(cfile,&size);
    cout << size;
    FindClose(cfile);
Результат - 3435973836

C++
1
2
3
4
5
6
    WIN32_FIND_DATA Data;
    HANDLE cfile = FindFirstFile(LPCWSTR("voxed.exe"),&Data);
    DWORD size;
    GetFileSize(cfile,&size);
    cout << size;
    FindClose(cfile);
Результат - 3435973836

Это я где-то накосячил, или же тут ест что-то еще?

Добавлено через 1 час 8 минут
Нашел информацию, оказывается там все сложнее чем кажется...

HANDLE cfile;
cfile=CreateFile(LPCWSTR("client.exe"),G ENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EX ISTING,FILE_ATTRIBUTE_NORMAL,0);

int FileSize=GetFileSize(cfile,NULL);
cout << FileSize;
FindClose(cfile);
результат - -1.
Буду дальше думать...
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
08.08.2011, 00:53
#include "windows.h"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    WIN32_FIND_DATA Data;
    HANDLE hFile;
    DWORD dwSize;
    TCHAR textBuffer[MAX_PATH];
    LPCTSTR path = "client.exe";
    
    hFile = CreateFile (path, GENERIC_READ | GENERIC_WRITE, 0,
            NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    dwSize = GetFileSize (hFile, 0);
    wsprintf (textBuffer, "размер %s: %d байтов", path, dwSize);
    MessageBox (0, textBuffer, "", 0);
    CloseHandle (hFile);
}
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
08.08.2011, 06:28
Цитата Сообщение от MadRabbit Посмотреть сообщение
Хо-хо-хо, мне эта функция выдает один и тот же размер на 2 разных файла.
Так бывает, когда используешь не инициализированные переменные и не читаешь документацию.)
Через аргумент передаются верхние 32 бита размера файла, а младшие 32 бита через возвращаемое значение передаются. Т.е. размер файла - 64 битное число может быть.

Цитата Сообщение от MadRabbit Посмотреть сообщение
LPCWSTR("client.exe")
Не правильно. Для "широких" символов нужно L"client.exe". Ты же просто привёл указатель одного типа к другому, поэтому вместо имени файла у тебя просто мусор. А раз мусорного файла нет, то переменная size осталась не изменённой и заполненная мусором. "Так бывает, когда используешь не инициализированные переменные"(с). Можете цитировать.)
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 11:28  [ТС]
LPCTSTR path = "client.exe";
Error: The var of type "const char *" cannot be used to initialize an anty of type LPCWSTR.
Ты же просто привёл указатель одного типа к другому, поэтому вместо имени файла у тебя просто мусор. А раз мусорного файла нет, то переменная size осталась не изменённой и заполненная мусором. "Так бывает, когда используешь не инициализированные переменные"(с). Можете цитировать.)
Я когда искал информацию по данной функции, нашел 3 варианта:
1 - "client.exe" Error: The var of type "const char *" cannot be used to initialize an anty of type LPCWSTR.
2 - LPCWSTR("client.exe") об этом ты уже сказал.
3 - hf Переменная.

Так что я пока все еще в растеряности.
Не правильно. Для "широких" символов нужно L"client.exe".
Пошел гуглить.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
08.08.2011, 11:37
Цитата Сообщение от MadRabbit Посмотреть сообщение
"client.exe" Error: The var of type "const char *" cannot be used to initialize an anty of type LPCWSTR
Давай распишу более понятным образом.
C++
1
2
3
4
5
6
7
8
9
10
// Так пишешь ты
const char * client = "client.exe";
const wchar_t * wideClient = (const wchar_t*)client;
//Это эквивалентно записи
int * a = 0;
double * b = (double*)a;
// Т.е. в большинстве случаев это не имеет смысла
 
// А нуно
const wchar_t * wideClient = L"client.exe";
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 11:46  [ТС]
Вроде понял, сейчас проверим.

Нашел вот такой пример
TCHAR * cfname = TEXT("fmtest.txt");
на
http://msdn.microsoft.com/en-u... S.85).aspx

буду проверять.

Добавлено через 6 минут
C++
1
2
3
4
5
6
    HANDLE cfile;
    const wchar_t * cfname = L"client.exe";
    cfile=CreateFile(cfname,GENERIC_READ |GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    DWORD Size=GetFileSizeEx(cfile,NULL);
    cout << Size;
    FindClose(cfile);
Получаю вылет. Что-то видимо я недопонял...
Аналогично и с вариантом из msdn.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 11:51
FindClose ? Может быть CloseHandle !?
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 11:55  [ТС]
FindClose ? Может быть CloseHandle !?
Да, накосячил, исправил, снова вылет получил.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 11:59
А может ты кинешь весь код целиком + EXE-шник, а то все как-то очень у тебя кратко и разобраться трудно.
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 12:18  [ТС]
Ну если ты этого хочешь, то вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "iostream"
#include "string"
#include "stdio.h"
#include "windows.h"
 
using namespace std;
 
int main( )
{
    system("TITLE Optizone Ace of Spades");
    char name[100];
    setlocale(LC_CTYPE,"Russian");
    cout << "Ваш ник:";
    cin >> name;
    int len = strlen(name);
    cout << "\n";
    if(len > 24 || len < 2)
    {
    cout << "Ваш ник либо больше 24 символов, либо меньше 2\nПожалуста, попробуйте ввести другой ник.\n";
    main();
    }
    else
    {
    FILE *file;
    char fname[24] = "config.ini";
    char input[6][50];
 
    file = fopen(fname,"r");
 
    if(file == 0)
{
    cout << "Отсутствует файл config.ini\nПереустановка клиента может решить эту проблему\n";
    cout << "Не забудте посетить наш сайт! www.Optizone.ru\n";
    system("PAUSE");
    return 0;
}
    fgets(input[1],50,file);
    fgets(input[1],50,file);
    fgets(input[2],50,file);
    fgets(input[3],50,file);
    fgets(input[4],50,file);
    fgets(input[5],50,file);
    fclose(file);
 
    fopen(fname,"w");
    fputs("name ",file);
    fputs(name,file);
    fputs("\r\n",file);
    fputs(input[1],file);
    fputs(input[2],file);
    fputs(input[3],file);
    fputs(input[4],file);
    fputs(input[5],file);
    fclose(file);
 
 
    cout << "Начата проверка версии клинта...\n";
 
    HANDLE cfile;
    const wchar_t * cfname = L"client.exe";
    cfile=CreateFile(cfname,GENERIC_READ |GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    DWORD Size=GetFileSizeEx(cfile,NULL);
    cout << Size;
    CloseHandle(cfile);
 
    cout << "Не забудте посетить наш сайт! www.Optizone.ru\n";
    system("PAUSE");
    system("start aos://3997065144");
    }
    return 0;
}
http://up.optizone.ru/607066/
Тут лаунчер, файл конфигураций и тот самый client.exe
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 13:15
Только что заметил.. А почему у тебя второй параметр функции GetFileSizeEx равен нулю!? Нулю он не может быть равен.
Используй GetFileSize, в этой функции второй параметр нулю уже может быть равен, т.е. замени только имя функции.

Добавлено через 26 минут
Да и возвращает GetFileSizeEx BOOL а не DWORD ...
1
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 13:23  [ТС]
Так и знал что в 4 часа ночи, есть хорошо пытатся искать решение подобной проблемы. Уже второй косяк на этой основе.
Нус, все работает. Спасибо вам обоим за помощь.

Добавлено через 4 минуты
Хм... Просто поменял имя файла, дабы получить размер другого файла, и тут что-то касое...
client.exe размер который показывает лаунчер: 382464, настоящий размер: 382464
vexed.exe размер который показывает лаунчер: 4294967295 настоящий размер: 485888

C++
1
const wchar_t * cfname = L"vexed.exe";
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 13:33
Цитата Сообщение от MadRabbit Посмотреть сообщение
vexed.exe размер который показывает лаунчер: 4294967295 настоящий размер: 485888
Вот как раз для такого случая необходим второй параметр этой функции - указатель на верхний DWORD 64-битного значения.
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 13:36  [ТС]
Стоп, но файл то не больше 4гб. На сколько я знаю, это нужно лишь в случае, если файл больше 4 гб.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 13:52
Я тут решил проверить работоспособность функции с большим файлом... С GetFileSize возникли непонятные проблемы, зато GetFileSizeEx работает корректно, вот пример:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
#include <stdio.h>
 
int main()
{
    HANDLE      hFile;
    LARGE_INTEGER   liSize;
 
    hFile = CreateFile( "test.zzz", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
 
    GetFileSizeEx( hFile, &liSize );
 
    printf( "%llu\n", liSize.QuadPart );
 
    CloseHandle( hFile );
    return 0;
}
P.S.: Тестировал с размером файла 13 гигабайт.

Стоп. Не совсем понял что у тебя там происходит. В общем попробуй последний пример.
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 14:26  [ТС]
Но так мой файл то и мегабайта не вешает. Собственно, этот вариант не может подходить.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2011, 14:35
Показывай что написал и что получается. У меня все работает.
0
 Аватар для MadRabbit
0 / 0 / 1
Регистрация: 07.08.2011
Сообщений: 53
08.08.2011, 15:45  [ТС]
Нус написал я вот так:
C++
1
2
3
4
5
6
7
    HANDLE cfile;
    const wchar_t * cfname = L"vexed.exe";
    cfile=CreateFile(cfname,GENERIC_READ |GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    LARGE_INTEGER ilsize;
    GetFileSizeEx(cfile,&ilsize);
    printf( "%llu\n", ilsize.QuadPart );
    CloseHandle(cfile);
Получил 14757395258967641292
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2011, 15:45
Помогаю со студенческими работами здесь

Проблемы при установке программ.Не устанавливаются некоторые прогаммы
Здравствуйте. У меня начались проблемы с установкой некоторых программ.Прилагаю скрины. ...

Домен или mdaemon? Проблемы с доставкой почты на некоторые адреса
Здравствуйте? уважаемые форумчане! Заранее извиняюсь. Возможно не втом разделе, но я пошел по следам тем о мдаемоне некоторое время...

Жесткий диск после вирусов перестал видеть некоторые папки с файлами
Всем доброго времени суток. Помогите пожалуйста!!! Жесткий диск после вирусов перестал видеть некоторые папки с файлами.Но,когда вставляю...

Проблемы с файлами *.swf
Всем привет! Вот сейчас захотел поиграть в одну игру в браузере, обычная swf, одиночнай, браузер(Опера 9,64) не захотел ее отображать -...

Ошибка "Невозможно смантировать образ. Нет доступа к файлу" с mdf файлами
Возможно пишу не туда заранее извиняюсь) но все таки: Иногда скачиваю образы MDF и практически всегда мне выдается ошибка с надписью:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru