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

Подскажите по работе с файлами - C++

Восстановить пароль Регистрация
 
askretov
0 / 0 / 0
Регистрация: 01.06.2009
Сообщений: 15
09.06.2009, 09:41     Подскажите по работе с файлами #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    struct MyStruct {
        char * Nam[50];
        unsigned int Salary;
    };
 
    MyStruct emp;
 
    *emp.Nam="Ivan Ivanov";
    emp.Salary=109000;
    ofstream f ("emp.dat",ios::binary);
    f.write((char*)&emp,sizeof(MyStruct));
 
    *emp.Nam="Petr Petrov";
    emp.Salary=85000;
    f.write((char*)&emp,sizeof(MyStruct));
    f.close();
При записи в файл все ок... только вот когда читаешь из файла поле Nam - пустое... а Salary читается ок ! Почему так ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 09:48     Подскажите по работе с файлами #2
При записи в файл все ок...
это тебе так кажется.
глубинный смысл вот этой строчки поясни, что ты тут делаешь
*emp.Nam="Ivan Ivanov";
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.06.2009, 09:55     Подскажите по работе с файлами #3
используй
strcpy(emp.Nam,"Ivan Ivanov");
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 10:00     Подскажите по работе с файлами #4
Patch,
твой вариант еще хуже ((:

у него хотя бы присваивание нормально отработает, а твоя strcpy весело потрёт данные в области массива указателей.

А теперь - правильный ответ
char Name[50];
...
strncpy(emp.Nam, "zzz", sizeof(emp.Nam) / sizeof(emp.Nam[0])-1);
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16939 / 5344 / 328
Регистрация: 30.03.2009
Сообщений: 14,370
Записей в блоге: 26
09.06.2009, 10:05     Подскажите по работе с файлами #5
Цитата Сообщение от Rififi Посмотреть сообщение
strncpy(emp.Nam, "zzz", sizeof(emp.Nam) / sizeof(emp.Nam[0])-1);
В нагрузку к этому надо делать ещё "emp.Nam[sizeof(emp.Nam)-1]=0", потому как если имя будет длинное, то скопируется 49 ненулевых символов, а последний останется неинициализированным
askretov
0 / 0 / 0
Регистрация: 01.06.2009
Сообщений: 15
09.06.2009, 10:09  [ТС]     Подскажите по работе с файлами #6
Rififi,
strncpy(emp.Nam, "zzz", sizeof(emp.Nam) / sizeof(emp.Nam[0])-1);

Это самый простой способ присвоения "Hello World !" массиву emp.Nam ?

*emp.Nam="Ivan Ivanov"; - глубинный смысл не смогу объяснить...

То есть проблема исключительно с присвоением значения массиву символов ?

Почему через String такая же хрень получается ? (пустота всмысле)
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 10:30     Подскажите по работе с файлами #7
Evg,
В нагрузку к этому надо делать ещё "emp.Nam[sizeof(emp.Nam)-1]=0"
Да, верно.
Поэтому лучше использовать Strsafe api
StringCchCopyN и иже с ними

askretov,
Это самый простой способ присвоения "Hello World !" массиву emp.Nam ?
Открою секрет: нет способа присвоить что-либо массиву. Ни простого ни сложного. (:
Это самый простой способ, чтобы можно было использовать fwrite/fread

Добавлено через 5 минут 55 секунд
*emp.Nam="Ivan Ivanov"; - глубинный смысл не смогу объяснить...
у тебя массив из 50 указателей на чар
присваивание равносильно такому
emp.Nam[0] ="...";
у тебя получается набор из 50 чисел, которые являются адресами соответствующих символьных строк (или мусором), который тупо пишется в файл
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.06.2009, 10:46     Подскажите по работе с файлами #8
Цитата Сообщение от Rififi Посмотреть сообщение
Patch,
твой вариант еще хуже ((:
упс! да... у него-же массив указателей...
не ожида-а-а-ал...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2009, 16:44     Подскажите по работе с файлами
Еще ссылки по теме:

Флаги при работе с бинарными файлами C++
Ошибка при работе с файлами C++
C++ Дополнение к работе с файлами
Обработка исключений при работе с файлами C++
Ошибка при работе с файлами C++

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

Или воспользуйтесь поиском по форуму:
askretov
0 / 0 / 0
Регистрация: 01.06.2009
Сообщений: 15
09.06.2009, 16:44  [ТС]     Подскажите по работе с файлами #9
В итоге все работает так :

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
    struct MyStruct {
        char Nam[30];
        unsigned int Salary;
        unsigned int Age;
        };
 
    MyStruct emp;
    String Name;
 
    Name = "Ivan Ivanov";
    strcpy(emp.Nam, Name.c_str());
    emp.Salary=109000;
    emp.Age=28;
 
    TFileStream * tf = new TFileStream("emp2.dat",fmCreate | fmOpenReadWrite);
 
    tf->Write((char*)&emp,sizeof(MyStruct));
 
    emp.Nam[0] = '\0';
    Name = "Petr Petrov";
    strcpy(emp.Nam, Name.c_str());
    emp.Salary=85000;
    emp.Age=25;
 
    tf->Write((char*)&emp,sizeof(MyStruct));
 
    delete(tf);
В принципе, все вполне логично получается. Чтобы писать в файл структуру - она должна быть с жесткими рамками, то есть каждый элемент структуры должен иметь жесткие рамки. По-другому быть не может. Просто Delphi к примеру пишет на стадии компиляции ошибку, если в структуре сделать динамический массив... а в C++ видимо надо до этого доходить каждому самому

Спасибо всем за ответы !
Yandex
Объявления
09.06.2009, 16:44     Подскажите по работе с файлами
Ответ Создать тему
Опции темы

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