С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 10

Прочитать из файла структуру. Преобразование atoi

17.05.2015, 16:25. Показов 1128. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста, не могу красиво прочитать из файла.
Задали записать информацию в виде структуры в файл, а потом это же прочитать. Запись идет как надо, а прочитать не могу. Читаю построчно из файла с помощью getline и прочитанное пытаюсь преобразовать с помощью atoi. Одно число нормально, а на втором виснет.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
 
 
struct SSS//создаю структуру
{
    int kod, nomer;
    char str[15];// имя 
 
};
const int con=2;// количество строк в файле
const char fina[] = "failik";
int main()
{
    SSS ss[con], s[con];
    ofstream fout(fina);//открываю файл для записи
    int comm;
    if (!fout)//если файл не создался
    {
        cout << " Ошибка открытия файла";
        return 1;;
    }
    for (int i = 0; i < con; i++)//ввожу данные и записываю в файл
    {
        cout << "vvedite kod : ";
        cin >> ss[i].kod;
        cout << "vvedite nomer: ";
        cin >> ss[i].nomer;
        cout << " vvedite name: ";
        cin >> ss[i].str;
        fout.width(15); fout << ss[i].str;
        fout.width(8); fout << ss[i].kod;
        fout.width(8);  fout << ss[i].nomer << endl;
    }
    fout.close();// закрываю файл
    ifstream fin(fina);// открываю для чтения 
    const int l_buf = 8 + 8 + 15;
    char buf[l_buf];
    cout << "show: " << endl;
    while (!fin.eof())
    {
        int i = 0; 
        fin.getline(buf, l_buf);// читаю строку
        cout << buf << endl;// вывожу ее для проверки
                strncpy(s[i].str, buf, 15);// беру 15 символов и записываю в имя
        cout << s[i].str<<endl;// вывожу для проверки
 
        s[i].nomer = atoi(buf + 23);//преобразовываю 8 символов в int
        cout << s[i].nomer << endl;
 
        s[i].kod= atoi(buf+15);//------пытаюсь сделать тоже что и с номером и не работает 
        cout << s[i].kod;
                i++;
    }
    fin.close();
    return 0;
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2015, 16:25
Ответы с готовыми решениями:

Прочитать структуру из файла
Задача: прочитать структуру из файла Вопрос: 1. почему не читаются строки из файла? 2. правильно ли я читаю структуру из файла? ...

Не могу прочитать структуру с файла
Доброго времени суток. Записываю структуру так template&lt;typename T&gt; bool SaveStruct(T mys,char *path) { ofstream fout; ...

Прочитать информацию из файла и рассортировать как структуру, где хранятся данные про каждую книгу
в файле записываю информация про книги: автор, название, год издания, кол-во страниц. нужно с читать её из файла и рассортировать как...

11
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
17.05.2015, 16:38
Цитата Сообщение от Анастасия М Посмотреть сообщение
s[i].kod= atoi(buf+15);//------пытаюсь сделать тоже что и с номером и не работает
Функции atoi должна передаваться строка, оканчивающаяся нулевым символом. Нулевой символ у тебя, скорее всего, единственный в строке и идёт за вторым числом, поэтому по сути ты передаёшь числа, слитые в одно число.
0
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 10
17.05.2015, 19:26  [ТС]
Enno, Понимаете такой метод есть в учебнике(практикум Павловской в универе давали) и там он работает. Правда там второй atof, но это же не важно.
C++
1
2
3
4
5
6
7
8
void Man::Set(const char*fromBuf)
{
    birth_year = atoi(fromBuf + l_name);
}
void Man::Set(const char*fromBuf)
{
    pay = atof(fromBuf + l_name + l_year);
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.05.2015, 20:53
Анастасия М, Суть твоей проблемы не разглядел, но по ходу обнаружил не очень понятный фрагмент
C++
1
2
3
4
5
6
while (!fin.eof())
    {
        int i = 0; 
        ....  
        i++;
    }
????
0
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 10
18.05.2015, 13:31  [ТС]
Байт, он читает по стоке пока не кончиться файл, а i чтобы при переходе на новую строку менялся номер элемента массива структур.
C++
1
SSS ss[con], s[con]
Можно было и без этого, если бы надо было просто прочитать и вывести. Но это как отдельный кусок, где считываются данные из файла и записываются в структуру для дальнейшей работы. Может быть я не так сделала ?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
18.05.2015, 14:12
Анастасия М,
Суть в том что ты в один и тот же элемент массива записываешь. Покажи как выглядит строка у тебя и как выглядит строка из примера в учебнике.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
18.05.2015, 17:16
Цитата Сообщение от Анастасия М Посмотреть сообщение
а i чтобы при переходе на новую строку менялся номер элемента
Дык, в том и дело, что он не меняется. Смотри. Ты входишь в цикл while. Присваиваешь i=0; Что-то делаешь. Потом i++; (стал равным 1). И снова цикл выполняется с начала. И снова i=0.

Добавлено через 13 минут
Анастасия М, Еще мне очень не нравится, что ты фактически бинарные данные (int kod, nomer) записываешь в текстовой файл как текст (fout<<...) ... хм... и читаешь тоже как текст... Я, к сожалению, не очень хорошо знаю детали ofstream-ifstream, ибо по застарелой привычке пользуюсь fprintf. Но может быть дело в размере буфера l_buf ? Сделай-ка его побольше. Вреда в любом случае не будет.

Добавлено через 3 минуты
Цитата Сообщение от Enno Посмотреть сообщение
Функции atoi должна передаваться строка, оканчивающаяся нулевым символом.
Не обязательно. atoi прекращает свою работу, как только видит, что дальнейшие преобразования бессмысленны. Так, строку "+1234-678" он переведет в 1234, а "12 345" в 12.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
18.05.2015, 17:30
Байт,
Это я подводил к тому что числа слеплены. В примере с float точка обозначала конец преобразований, возможно.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
18.05.2015, 21:18
Цитата Сообщение от Enno Посмотреть сообщение
Это я подводил к тому что числа слеплены.
Да, понимаю. Тут вообще очень много ерунды. Зачем бинарные данные записывать в строковой форме? И вообще предполагать, что строковое представление числа будет иметь именно это количество байт?
Цитата Сообщение от Анастасия М Посмотреть сообщение
такой метод есть в учебнике(практикум Павловской в универе давали) и там он работает.
Вот ведь учебники такие и практикумы... А учат там созданию программ, зависимых от данных. Хужее этого и представить чего-то трудно.
Он будет работать на каких-то числах, а на других (которые вы не протестировали) покажет вам толстый кукиш. Или даже протестируете, и он вам покажет кукиш на тесте. И опять сюда, "ой-ой-ой, мой совершенно правильный код не работает, наверное, atoi виновата"
Совет ТС. Если в вашем универе практикуют такие практики, бросьте его на фиг. Лучше раньше это сделать, чем потом себе локти кусать.
0
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 10
18.05.2015, 22:24  [ТС]
Байт, я поняла спасибо, нужно i убрать из цикла. И по заданию мне нужны бинарные данные. Я пыталась сделать как с текстовым, так как до этого не работала с бинарными данными.
У меня пробелы в базовых знаниях пытаюсь их восполнить, но периодически вылезают разные ошибки. Как тогда правильно считать бинарную строку ?
Enno, чтобы разделить запись можно поставить между пробел да ?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
19.05.2015, 00:37
Цитата Сообщение от Анастасия М Посмотреть сообщение
Как правильно считать бинарную строку ?
Опять же вынужден просить прощения за незнание С++-техники.
В Си это делается так
C
1
2
3
4
5
6
7
8
9
10
11
12
FILE *f = fopen(fina, "wb");
for (int i = 0; i < con; i++)//ввожу данные и записываю в файл
    {
        cout << "vvedite kod : ";
        cin >> ss[i].kod;
        cout << "vvedite nomer: ";
        cin >> ss[i].nomer;
        cout << " vvedite name: ";
        cin >> ss[i].str;
        fwrite(&ss[i], sizeof(SSS), 1, f);
    }
    fclose(f);
Читается аналогично, через fread
Скорее всего и у С++ есть аналогичные классы и методы. Но это уж вы сами, без меня.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
19.05.2015, 05:04
Цитата Сообщение от Анастасия М Посмотреть сообщение
чтобы разделить запись можно поставить между пробел да ?
Конечно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2015, 05:04
Помогаю со студенческими работами здесь

Прочитать файл в обратном порядке т.е. встать в конец файла и прочитать до начальной позиции
подскажите пожалуйста как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?

Как прочитать такую структуру XML
Здравствуйте! как прочитать такую структуру на php &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;category&gt; &lt;marka...

Прочитать bin и записать его в структуру
Здравствуйте. Пытаюсь прочитать бинарный файл и записать его в структуру. Файл начинается с такой последовательности: 44 65 4d 4f 38 02....

Где можно прочитать про АТД и структуру на С++?
Не нашла такого раздела здесь Литература C++ где можно подробнее узнать по этой теме?( сайты, книжки, видеоуроки и т.п.) Срочно нужно...

Прочитать документ Excel и данные записать в структуру
Доброго времени, форумчане. Начал работать с Excel через C#. Необходимо считать документ и данные записать в структуру вида: № пары,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru