Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
#1

sprintf_s оставляет мусор при записи, как бы я не колдовал - C++

17.06.2013, 14:26. Просмотров 986. Ответов 14
Метки нет (Все метки)

В общем, проблема простая. Делаю настройки для своей программы, дошел до момента автоопределения настроек и записи их в файл. Проблема вот в чем, чтобы записать разрешение экрана в файл, я использовал sprintf_s (с простым sprintf компилятор не дает) и WriteFile. Как бы я не колдовал, после последнего символа, через пробел выкидывает мусор:

SCREEN_SIZE_X=1920
SCREEN_SIZE_Y=1058 юююююююююююююююююююююююююю

Более того, жалуется на ошибку доступа к записи в файл (в 0x000000), и крашит приложение. Я тут уже наколдовал лишнего, так что особо не обращайте внимания, но вроде я все перепробовал.

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
short SCREEN_SIZE_X = NULL;
    short SCREEN_SIZE_Y = NULL;
 
    HANDLE hFile;
    if (INVALID_HANDLE_VALUE==(hFile=CreateFile(L"Settings.ini",GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)))
{
    CloseHandle(hFile);
    SCREEN_SIZE_X = GetSystemMetrics(16);
    SCREEN_SIZE_Y = GetSystemMetrics(17);
    char buf[124] = {NULL};
    sprintf_s(buf,"SCREEN_SIZE_X=%d\r\nSCREEN_SIZE_Y=%d",SCREEN_SIZE_X,SCREEN_SIZE_Y);
    hFile=CreateFile(L"Settings.ini",GENERIC_WRITE, FILE_SHARE_WRITE,NULL, CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,buf, sizeof(buf),NULL,NULL);
    CloseHandle(hFile);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос sprintf_s оставляет мусор при записи, как бы я не колдовал (C++):

Мусор при записи значений в файл - C++
Дорого времени суток господа! Извиняюсь, если где-то уже была создана такая тема и я не поискал ее. При записи букафф в файл вылезая...

Sprintf_s и указатель - C++
char qwe; sprintf_s(qwe, "%u\t", handleFind) все ок. char qwe; char * p = qwe; sprintf_s(p, "%u\t", handleFind) Ругается на...

Мусор в начале строки при записи в файл - C (СИ)
Генерирует все как надо, но вначале идет мусор. Есть у кого-нибудь идеи как исправить? Буду очень благодарен. void cycle5 (double...

При перемещении сплиттер оставляет следы на контролах - C++ WinAPI
Суть в том что когда я двигаю сплиттер меняя размер левого или правого окна, сплиттер оставляет следы и не добавляется столбец в...

'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead - Visual C++
ошибка: Error 1 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable...

При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор - C++
Суть действий: При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор. Раньше я...

14
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:29 #2
Цитата Сообщение от MadRabbit Посмотреть сообщение
sprintf_s оставляет мусор при записи, как бы я не колдовал
sprint_s тут не при чем. WriteFile записывает в файл буфер заданного размера. Ты размер задал 1024. Значит столько и будет записано. И не важно, что у тебя там строка, и где она заканчивается. Записывай правильное кол-во байт.
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:31  [ТС] #3
Ну дык, а если количество байт неизвестно (а оно будет неизвестно), что же тогда делать?
0
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
17.06.2013, 14:33 #4
Цитата Сообщение от MadRabbit Посмотреть сообщение
что же тогда делать?
не использовать winapi
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:38  [ТС] #5
Цитата Сообщение от Кудаив Посмотреть сообщение
не использовать winapi
Смешно, а ты шутник. А если серьезно?

Добавлено через 4 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
sprint_s тут не при чем. WriteFile записывает в файл буфер заданного размера. Ты размер задал 1024. Значит столько и будет записано. И не важно, что у тебя там строка, и где она заканчивается. Записывай правильное кол-во байт.
Просто если по логике, то буфер у меня выглядит примерно так "что-то написанно NULL". Тобишь, раз на NULL не останавливается, то он как минимум его и должен записывать, а почему-то пишет Ю.
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:39 #6
Цитата Сообщение от MadRabbit Посмотреть сообщение
Ну дык, а если количество байт неизвестно
Как оно, блин, может быть неизвестно, если у тебя нулевой символ в конце строки. Шутник. strlen на что?

Добавлено через 46 секунд
Цитата Сообщение от MadRabbit Посмотреть сообщение
Тобишь, раз на NULL не останавливается
А как ты нулевой символ хочешь увидеть? Открой в hex-редакторе и посмотри.
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:43  [ТС] #7
Цитата Сообщение от Vourhey Посмотреть сообщение
Как оно, блин, может быть неизвестно, если у тебя нулевой символ в конце строки. Шутник. strlen на что?

Добавлено через 46 секунд

А как ты нулевой символ хочешь увидеть? Открой в hex-редакторе и посмотри.
Я помню что он как 00 отображается, я со скриптового языка пересел на C++, дочернего от C++. Он на нуле заканчивал запись.
С мусором проблема решена, но все равно крашит.

C++
1
Необработанное исключение по адресу 0x752ADEE1 (KernelBase.dll) в Win32Project1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000.
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:50 #8
Цитата Сообщение от MadRabbit Посмотреть сообщение
Я помню что он как 00 отображается
Не должен. Ибо тогда, как в редакторе таком отличить два нуля от нулевого символа?
Цитата Сообщение от MadRabbit Посмотреть сообщение
Он на нуле заканчивал запись.
Связи между скриптовым языком с его библиотеками и WinApi не прослеживается, ну да ладно...
Цитата Сообщение от MadRabbit Посмотреть сообщение
С мусором проблема решена
Хорошо. Решается простым strlen'ом.
Цитата Сообщение от MadRabbit Посмотреть сообщение
но все равно крашит.
Найди у себя в коде ошибку обращения по нулевому адресу. Дебаггер в руки и вперед.
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:59  [ТС] #9
Найти то что-то нашел, hPrevInstance 0x00000000, но что делать с этой информацией я даже не знаю.)
Ошибка точно в этом куске кода (ну а где еще может быть ошибка записи?), если проходит условие "файл создан", то все хорошо.
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
17.06.2013, 15:05 #10
Цитата Сообщение от MadRabbit Посмотреть сообщение
Найти то что-то нашел, hPrevInstance 0x00000000, но что делать с этой информацией я даже не знаю.)
Воспринять как должное. В Win32 в winmain hPrevInstance всегда = NULL.
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 15:07  [ТС] #11
Цитата Сообщение от Gepar Посмотреть сообщение
Воспринять как должное. В Win32 в winmain hPrevInstance всегда = NULL.
Я просто реально не знаю что делать.
Сейчас просматриваю полное описание функции CreateFile, может я не в том месте NULL поставил, ибо обращается запись к 0 точке в памяти.
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 15:15 #12
C++
1
2
3
DWORD n;
             ...
    WriteFile(f, a, strlen(a), &n, NULL);
0
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 15:15  [ТС] #13
Пошарил в интернете, так как отношения с товарищем Vourhey успешно утрачены, изменил строку на: WriteFile(hFile,buf,strlen(buf),&dwBytes,NULL). Приложение не крашит, просто выключается. До того как начал химичить с этим куском, все было хорошо (без этого куска все остается так же). Но это уже мелочи.
Спасибо за помощь.
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 15:16 #14
Цитата Сообщение от MadRabbit Посмотреть сообщение
так как отношения с товарищем Vourhey

Не по теме:

Какие отношения, ты че, из светло-синих? Тьфу...

1
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 15:18  [ТС] #15
Цитата Сообщение от Vourhey Посмотреть сообщение

Не по теме:

Какие отношения, ты че, из светло-синих? Тьфу...

Хах, тем не менее, спасибо за помощь.
0
17.06.2013, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2013, 15:18
Привет! Вот еще темы с ответами:

Мусор при компиляции - C++
Только начал работать с классами, и на первом же примере застрял. Посмотрите пожалуйста, в чем ошибка? //заголовочный файл class.h ...

Мусор при выводе - C++
Динамически выделил память под массив, записал туда значения, при выводе он выводит элементов больше чем я выделял, как исправить? ...

Мусор при присвоении оператора + - C++
программа по подсчету времени. Сумируются 2 времени (TT (min hour) и TM(min hour)) time operator+(const time&a){ time temp; ...

Мусор при чтении файла - C++
При чтений текста из файла программа вставляет букву я на конце Как убрать?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru