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

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

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

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

17.06.2013, 14:26. Просмотров 941. Ответов 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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 14:26     sprintf_s оставляет мусор при записи, как бы я не колдовал
Посмотрите здесь:

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

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

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

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

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

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

DES. Мусор при расшифровке - C++
При расшифровке появляются лишние символы. Знаю, с чем это связано. Не знаю, как избавиться.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:29     sprintf_s оставляет мусор при записи, как бы я не колдовал #2
Цитата Сообщение от MadRabbit Посмотреть сообщение
sprintf_s оставляет мусор при записи, как бы я не колдовал
sprint_s тут не при чем. WriteFile записывает в файл буфер заданного размера. Ты размер задал 1024. Значит столько и будет записано. И не важно, что у тебя там строка, и где она заканчивается. Записывай правильное кол-во байт.
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:31  [ТС]     sprintf_s оставляет мусор при записи, как бы я не колдовал #3
Ну дык, а если количество байт неизвестно (а оно будет неизвестно), что же тогда делать?
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
17.06.2013, 14:33     sprintf_s оставляет мусор при записи, как бы я не колдовал #4
Цитата Сообщение от MadRabbit Посмотреть сообщение
что же тогда делать?
не использовать winapi
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
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:39     sprintf_s оставляет мусор при записи, как бы я не колдовал #6
Цитата Сообщение от MadRabbit Посмотреть сообщение
Ну дык, а если количество байт неизвестно
Как оно, блин, может быть неизвестно, если у тебя нулевой символ в конце строки. Шутник. strlen на что?

Добавлено через 46 секунд
Цитата Сообщение от MadRabbit Посмотреть сообщение
Тобишь, раз на NULL не останавливается
А как ты нулевой символ хочешь увидеть? Открой в hex-редакторе и посмотри.
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
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.06.2013, 14:50     sprintf_s оставляет мусор при записи, как бы я не колдовал #8
Цитата Сообщение от MadRabbit Посмотреть сообщение
Я помню что он как 00 отображается
Не должен. Ибо тогда, как в редакторе таком отличить два нуля от нулевого символа?
Цитата Сообщение от MadRabbit Посмотреть сообщение
Он на нуле заканчивал запись.
Связи между скриптовым языком с его библиотеками и WinApi не прослеживается, ну да ладно...
Цитата Сообщение от MadRabbit Посмотреть сообщение
С мусором проблема решена
Хорошо. Решается простым strlen'ом.
Цитата Сообщение от MadRabbit Посмотреть сообщение
но все равно крашит.
Найди у себя в коде ошибку обращения по нулевому адресу. Дебаггер в руки и вперед.
MadRabbit
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 14:59  [ТС]     sprintf_s оставляет мусор при записи, как бы я не колдовал #9
Найти то что-то нашел, hPrevInstance 0x00000000, но что делать с этой информацией я даже не знаю.)
Ошибка точно в этом куске кода (ну а где еще может быть ошибка записи?), если проходит условие "файл создан", то все хорошо.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
17.06.2013, 15:05     sprintf_s оставляет мусор при записи, как бы я не колдовал #10
Цитата Сообщение от MadRabbit Посмотреть сообщение
Найти то что-то нашел, hPrevInstance 0x00000000, но что делать с этой информацией я даже не знаю.)
Воспринять как должное. В Win32 в winmain hPrevInstance всегда = NULL.
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
Почетный модератор
6477 / 2252 / 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
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 53
17.06.2013, 15:15  [ТС]     sprintf_s оставляет мусор при записи, как бы я не колдовал #13
Пошарил в интернете, так как отношения с товарищем Vourhey успешно утрачены, изменил строку на: WriteFile(hFile,buf,strlen(buf),&dwBytes,NULL). Приложение не крашит, просто выключается. До того как начал химичить с этим куском, все было хорошо (без этого куска все остается так же). Но это уже мелочи.
Спасибо за помощь.
Vourhey
Почетный модератор
6477 / 2252 / 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++
Проблема. Как сделать что бы в строки не записывался муссор. Например: вожу 2 студентов (Например: Vladislav,Anna). При считывании в имени...

При выводе массива, выводит мусор - C++
Програмка генератор паролей! #include<iostream> #include<time.h> #include<conio.h> using namespace std; void...

Как удалить символ перевода строки, который оставляет cin - C++
Как удалить символ перевода строки, который оставляет cin. Нужно вводить в строчку чаровые переменные, и чтобы они так в строке и...

Мусор в элементах массива при передаче в функцию - C++
Доброго времени суток, столкнулся с данной проблемой в CLI, попробовал реализовать аналог для консольного приложения всё работает, почему...


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

Или воспользуйтесь поиском по форуму:
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 оставляет мусор при записи, как бы я не колдовал
Ответ Создать тему
Опции темы

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