Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
MadRabbit
 Аватар для MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:26     sprintf_s оставляет мусор при записи, как бы я не колдовал #1
В общем, проблема простая. Делаю настройки для своей программы, дошел до момента автоопределения настроек и записи их в файл. Проблема вот в чем, чтобы записать разрешение экрана в файл, я использовал 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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 14:26     sprintf_s оставляет мусор при записи, как бы я не колдовал
Посмотрите здесь:

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

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

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

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

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2013, 15:18     sprintf_s оставляет мусор при записи, как бы я не колдовал
Еще ссылки по теме:

C++ Мусор в строках при чтении структуры
C++ При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор
C++ Мусор при присвоении оператора +

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

Или воспользуйтесь поиском по форуму:
MadRabbit
 Аватар для MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 15:18  [ТС]     sprintf_s оставляет мусор при записи, как бы я не колдовал #15
Цитата Сообщение от Vourhey Посмотреть сообщение

Не по теме:

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

Хах, тем не менее, спасибо за помощь.
Yandex
Объявления
17.06.2013, 15:18     sprintf_s оставляет мусор при записи, как бы я не колдовал
Ответ Создать тему
Опции темы

Текущее время: 16:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru