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

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

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

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

09.06.2009, 09:41. Просмотров 474. Ответов 8
Метки нет (Все метки)

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 читается ок ! Почему так ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2009, 09:41     Подскажите по работе с файлами
Посмотрите здесь:

Вопрос по работе с файлами - C++
Пока i-=2 не вставил, выводила пустую строку в результате. Почему так? Что за 2 знака перед eof() мешали? int main(int argc, char*...

Дополнение к работе с файлами - C++
Здравствуйте, ситуация довольно глупая, но умудрились почти поссориться с товарищем из группы. Вот кусок кода #include <iostream> ...

Совет по работе с файлами - C++
надо написать программу, которая считывает данные из текстового файла в структуру с 4-мя полями, типа однонаправленный список, а потом...

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

Ошибка при работе с файлами - C++
Необходимо, создать текстовый файл со случайным именем в диапазоне 8 символов, латиница. Вот код: int main() { ...

Проблемы при работе с файлами - C++
доброго времени! возник у меня маленький трабл при работе с файлами. Причем совершенно не могу понять причину. Код такой: int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
2338 / 1053 / 44
Регистрация: 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
2338 / 1053 / 44
Регистрация: 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
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 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
2338 / 1053 / 44
Регистрация: 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++
Всем привет! Подккажите, плиз, что у меня неправильно в коде: #include <cstdlib> #include <stdio.h> #include <stdlib.h> #include...

Маленький вопрос по работе с файлами - C++
очень глупый к тому же) есть FILE * f=fopen(filename,"r"); FILE* F; как мне присвоить*F=*f? заранее спасибо)

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

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