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

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

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

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

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

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

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

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

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

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

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

8
Rififi
2360 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 09:48 #2
При записи в файл все ок...
это тебе так кажется.
глубинный смысл вот этой строчки поясни, что ты тут делаешь
*emp.Nam="Ivan Ivanov";
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.06.2009, 09:55 #3
используй
strcpy(emp.Nam,"Ivan Ivanov");
0
Rififi
2360 / 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);
0
Evg
Эксперт CАвтор FAQ
18380 / 6428 / 441
Регистрация: 30.03.2009
Сообщений: 17,844
Записей в блоге: 28
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
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 такая же хрень получается ? (пустота всмысле)
0
Rififi
2360 / 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 чисел, которые являются адресами соответствующих символьных строк (или мусором), который тупо пишется в файл
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.06.2009, 10:46 #8
Цитата Сообщение от Rififi Посмотреть сообщение
Patch,
твой вариант еще хуже ((:
упс! да... у него-же массив указателей...
не ожида-а-а-ал...
0
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++ видимо надо до этого доходить каждому самому

Спасибо всем за ответы !
0
09.06.2009, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2009, 16:44
Привет! Вот еще темы с ответами:

Ошибка при работе с файлами - C++
Всем привет! Подккажите, плиз, что у меня неправильно в коде: #include <cstdlib> #include <stdio.h> #include <stdlib.h> #include...

Информация по работе с бинарными файлами - C++
У меня возникла проблема при работе с бинарными файлами, вернее нет инфо чтоб почитать, да и хелп скуден, вышлите по мылу или скиньте сюда...

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

Вопрос по работе с файлами в Visual Studio - C++
Написал программу для работы с файлом в Visual Studio. Iostream подключил. Но такие вот привычные записи, как, например, ifstream...


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

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

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