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

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

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

Не записывает структуру в файл - C++

10.01.2014, 19:27. Просмотров 449. Ответов 11
Метки нет (Все метки)

Здравствуйте, вот собственно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct mystruct {
    double i;
    char color[10];
    char material[10];
};
 
int main(int argc, char* argv[])
{
 
    mystruct ms;
    memset(&ms, 0, sizeof ms);
    ms.i = 1;
    strcpy_s(ms.color, "черный");
    strcpy_s(ms.material, "дерево");
    errno_t file;
    FILE * pFile;
    file = fopen_s(&pFile, "file.dat", "wb");
    fwrite(&ms, sizeof(mystruct), 1, pFile);
    fclose(pFile);
    _getch();
    return 0;
}
После его выполнения, а выполняется он без ошибок, файл file.dat остается пустым... Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 19:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не записывает структуру в файл (C++):

Не записывает в файл - C++
посмотрите и исправьте ошибку в коде #include <stdio.h> #include <math.h> #include <conio.h> double f(double uu,double vv)...

Не записывает в файл - C++
#include "stdafx.h" #include <list> #include <conio.h> #include <iostream> #include <algorithm> #include <iterator> #include...

Не записывает в файл? - C++
Не записывает результат преобразования в файл, пожалуйста помогите! #include <stdio.h>//Подключение библиотеки стандартного...

Не записывает в файл - C++
Здравствуйте! Сделал сортировку,но почему то не записывается в файл. Сам код: #include<iostream> #include<fstream> using...

не записывает в файл - C++
суть - записать из 3-х файлов в 1 и обратно #define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include "conio.h" #include...

Не записывает в файл - C++
писал на visual studio, надо переделать на dev. товарищи, помогите. какая-то фигня с fаpp #include <iostream> #include <cstdlib> ...

11
xoror
29 / 31 / 2
Регистрация: 15.12.2013
Сообщений: 147
10.01.2014, 19:32 #2
Мне кажется что в этой строчке ошибка, но не уверен
Цитата Сообщение от Jinanton Посмотреть сообщение
file = fopen_s(&pFile, "file.dat", "wb");
pFile - указатель и от него еще берется адрес &pFile
0
Jinanton
3 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 53
10.01.2014, 19:36  [ТС] #3
Цитата Сообщение от xoror Посмотреть сообщение
pFile - указатель и от него еще берется адрес &pFile
Нет, тут ошибки нет 100%, это причуда VS, и лично я это расцениваю как "привязку" к среде... использовалось неоднакротно
0
xoror
29 / 31 / 2
Регистрация: 15.12.2013
Сообщений: 147
10.01.2014, 19:48 #4
Jinanton, вот работающая программа (проверено)

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
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
 
struct mystruct {
    double i;
    char color[10];
    char material[10];
};
 
int main()
{
    mystruct ms;
 
    ms.i = 1;
    strcpy(ms.color, "черный");
    strcpy(ms.material, "дерево");
 
    FILE *pFile;
    pFile = fopen("file.dat", "wb");
    fwrite(&ms, sizeof(ms), 1, pFile);
    fclose(pFile);
 
    system("pause");
    return 0;
}
Запись в файл сделал через другую функцию
0
Jinanton
3 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 53
10.01.2014, 20:06  [ТС] #5
В какой среде делал?
P.S. когда начал только писать прогу так и написал, правда я всегда использую _getch() а не паузу, однако VS 2013 версии не работает с такими командами как strcpy и fopen, и требует поменять их на strcpy_s и fopen_s...

Добавлено через 2 минуты
блин я без понятия как тут ответ адресовать...
0
xoror
29 / 31 / 2
Регистрация: 15.12.2013
Сообщений: 147
10.01.2014, 20:09 #6
Цитата Сообщение от Jinanton Посмотреть сообщение
В какой среде делал?
В CodeBlocks

Я еще не сталкивался с функциями, которые заканчиваются _s. Так что не знаю почему та программа не работает)

Добавлено через 1 минуту
Цитата Сообщение от Jinanton Посмотреть сообщение
блин я без понятия как тут ответ адресовать...
Можно мышкой кликнуть по нику или выделить текст и потом появится надпись "Цитировать"
1
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.01.2014, 20:12 #7
Цитата Сообщение от Jinanton Посмотреть сообщение
однако VS 2013 версии не работает с такими командами как strcpy и fopen, и требует поменять их на strcpy_s и fopen_s...
Чтобы работала: Ошибка в SCANF
1
Jinanton
3 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 53
10.01.2014, 20:16  [ТС] #8
xoror, скомпилил твой код в 2010 версии, работает, у тебя с мусором записывает? ну и логичный вопрос как после strcpy добавить '\0', если заведомо не известно какой длины значение будет?
0
xoror
29 / 31 / 2
Регистрация: 15.12.2013
Сообщений: 147
10.01.2014, 20:21 #9
Цитата Сообщение от Jinanton Посмотреть сообщение
у тебя с мусором записывает?
С мусором, но это так и должно быть. Потому что создается двоичный файл

Цитата Сообщение от Jinanton Посмотреть сообщение
как после strcpy добавить '\0', если заведомо не известно какой длины значение будет?
Функция strcpy() сама добавит '\0' в конце

Но если очень надо добавить '\0' тогда так
C++
1
ms.color[9] = '\0';
В конце строки записывается 0
1
Jinanton
3 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 53
10.01.2014, 20:34  [ТС] #10
xoror, до конца строки все равно будет мусор, так потом при считывании мусор тоже останется...
0
_lunar_
1364 / 1292 / 101
Регистрация: 03.05.2011
Сообщений: 2,974
Завершенные тесты: 1
10.01.2014, 20:36 #11
Цитата Сообщение от xoror Посмотреть сообщение
Я еще не сталкивался с функциями, которые заканчиваются _s.
на примере memcpy_s (с wiki)
Чтобы не выполнять лишних действий, функция memcpy() не проверяет соответствие размера выходного буфера количеству копируемых байт, возлагая эту обязанность на программиста. В результате совершается достаточно много ошибок, способных привести к переполнению буфера.
Поэтому ближе к концу 2009 г. компания Microsoft добавила memcpy(), CopyMemory() и RtlCopyMemory() в список функций, запрещённых в соответствии с методикой разработки безопасных программ Secure Development Lifecycle (SDL). Те разработчики, которые хотят создавать совместимые с SDL приложения, должны будут использовать вместо memcpy() функцию memcpy_s, позволяющую указывать размер буфера. Функция memcpy_s() непереносима и не включена в стандарт Си.
2
xoror
29 / 31 / 2
Регистрация: 15.12.2013
Сообщений: 147
10.01.2014, 20:44 #12
Цитата Сообщение от _lunar_ Посмотреть сообщение
на примере memcpy_s (с wiki)
Спасибо. Мне надо как-нибудь взяться и почитать об этом. Уже сколько раз видел такие функции _s. Но в чем их отличия не понимал

Jinanton, чтобы не было мусора, можно всю структуру обнулить с помощью memset(&ms, 0, sizeof ms);
1
10.01.2014, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2014, 20:44
Привет! Вот еще темы с ответами:

Не записывает в файл - C++
Доброго времени суток. Написал код, который должен открывать файл, находить в нем определенный символ и заменять его на другой. Все...

В файл не записывает массив - C++
Добрый вечер. Есть двумерный строковый массив размером 10x80. При в воде массива создаётся файл, но массив туда не записывается....

записывает в файл каракули - C++
почему когда я ввожу данные мне в файл записывает каракули, и такое же когда ввивоже из файла на экран? #include &lt;iostream&gt; #include...

Неправильно записывает в файл - C++
Здравствуйте. Столкнулся с проблемой, что алгоритм хеширования md5, который находит программа, должна записать в файл, но когда я открываю...


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

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

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