Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 01.06.2009
Сообщений: 15
1

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

09.06.2009, 09:41. Просмотров 574. Ответов 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 читается ок ! Почему так ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2009, 09:41
Ответы с готовыми решениями:

Проблема в работе с файлами !
Здравствуйте, у меня есть только work.exe(который считает функцию 2 в степени х и выводит результат...

Дополнение к работе с файлами
Здравствуйте, ситуация довольно глупая, но умудрились почти поссориться с товарищем из группы. Вот...

Литература по работе с файлами
Уважаемые программисты,подскажите,пожалуйста - возможно кто-то помнит литературу с уклоном на...

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

8
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
09.06.2009, 09:48 2
При записи в файл все ок...
это тебе так кажется.
глубинный смысл вот этой строчки поясни, что ты тут делаешь
*emp.Nam="Ivan Ivanov";
0
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
09.06.2009, 09:55 3
используй
strcpy(emp.Nam,"Ivan Ivanov");
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
09.06.2009, 10:00 4
Patch,
твой вариант еще хуже ((:

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

А теперь - правильный ответ
char Name[50];
...
strncpy(emp.Nam, "zzz", sizeof(emp.Nam) / sizeof(emp.Nam[0])-1);
0
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
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 ненулевых символов, а последний останется неинициализированным
0
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 такая же хрень получается ? (пустота всмысле)
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
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 чисел, которые являются адресами соответствующих символьных строк (или мусором), который тупо пишется в файл
0
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
09.06.2009, 10:46 8
Цитата Сообщение от Rififi Посмотреть сообщение
Patch,
твой вариант еще хуже ((:
упс! да... у него-же массив указателей...
не ожида-а-а-ал...
0
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++ видимо надо до этого доходить каждому самому

Спасибо всем за ответы !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2009, 16:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Вопрос по работе с файлами
как в строке : open 'имя файла' for input as #1 сделать так чтобы программа искала файл в папке...

Задание по работе с файлами
Для двух файлов A и B, которые включают по 20 элементов :A = ({a}_{i}),B = ({b}_{i}),I=...

Информация по работе с файлами в Qt
Доброго времени суток! Первый раз в жизни пишу на форум, поскольку всегда справлялся сам. Но...


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

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

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