Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275

Ifstream считывает только первую строку

29.09.2015, 15:39. Показов 4744. Ответов 10
Метки нет (Все метки)

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


функция вывода:
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
int chteniebz(danie *structura, int &a){
    ifstream fin;
    fin.open("C://tetrad.txt");
    if (!fin.is_open()){ // даная запись говорит если нет данного файла, то вывести на экран сообщение 
        cout << "Файл не может быть открыт!\n";
    }
    else
    {
        do {
            fin >> structura->schitivanie;//такая запись считывает только одно слово с файла
            cout << structura->schitivanie << endl;
            fin.getline(structura->schitivanie, 50); // такая запись считывает всю строку с файла
            fin.close();
            cout << structura->schitivanie << endl;
            _getch();
            cout << "ведите число 1 для повторного считывания";
            cin >> a;
            system("cls");
 
        } while (a ==1);
        
    }
    return 0;
}
заголовочный файл:
C++
1
2
3
4
5
6
7
8
9
namespace constanti{
#define minut 60 //старый метод обявления константы
const int hour = 3600; // новый метод обявления константы
int sutki(86400);
const unsigned prosent = 100;
const char igrok1[7] = "игрок1";
const char igrok2[6] = { 'и', 'г', 'р', 'о', 'к', '2' };
int karti[2][3];
}
полный код:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#include <iostream>
#include <conio.h>
#include <random>
#include <time.h>
#include <fstream>
#include "Верхний колонтитул.h"
 
using namespace std;
using namespace constanti;
enum raspisanie{
    ponedelnik = 1,
    vtornik,
    sreda,
    chetverg,
    pyatnica,
    subota,
    voskresene,
    
};
struct danie {
    
    char imiy[20], schitivanie[50];
    int denroj;
    int mes;
    int god;
    
    
    
    
};
int kalkulyator( int &a, int &b, int &c){
    cout << "впишите первое число \n";
    cin >> a;
    cout << "впишите второе число \n";
    cin >> b;
    cout << "выберите операцию 1-прибавить, 2- отнять, 3- умножить, 4 - делить.\n";
    cout << "5 - определить процент.\n";
    cout << "1-е веденое число это число из которого нужно выяснить процент\n";
    cout << "2-е веденое число есть процент который нужно узнать\n";
    cin >> c;
 
    switch (c)
    {
    default:
    case 1:cout << a + b; break;
    case 2:cout << a - b; break;
    case 3:cout << a * b; break;
    case 4:cout <<(float) a / b; break;
    case 5: cout << " число с которого нужно вычеслить процент: " << a << " \n выбранный процент: " << b << endl;
          cout <<b<<" :процентов, от: "<<a<<" будет результат: " <<(float) a*b / prosent; break; /*новый стиль приведения вещественного числа: 
                                                              float a =static_cast <float>(y); float b =static_cast<float>(x); float c =a/b;*/
    }
 
    return 0;
 
}
int kosti(int &a, int &b, int &c){
 
    do{
        for (int c(0); c <= 5; c++){
 
            system("cls");
 
 
            a = rand() % 6;
            b = rand() % 6;
            cout << "1 игроку выпало : " << a << endl;
            cout << "2 игроку выпало : " << b << endl;
 
            if (a > b){
                cout << "выграл 1 игрок, ему выпало: " << a << " игроку 2 выпало : " << b << endl;
            }
            else if (a < b){
                cout << "выграл 2 игрок, ему выпало: " << a << " игроку 2 выпало : " << b << endl;
            }
            else { cout << "ничья! игроку 1 выпало: " << a << " игроку 2 выпало : " << b << endl; }
            system("pause");
        }
    } while (b==1);
    
 
    return 0;
}
int raspisanie(int &a){
    cout << "ведите день о котором хотите узнать:1- пн, 2- вт, 3 ср, 4- чт, 5-пт,6 -сб, 7-вс";
    cin >> a;
    if (a == 6 || a == 7){
        cout << "выходные дни";
    }
    else {
        switch (a)
        {
        default: cout << "такого дня не существует"; break;
        case 1: cout <<ponedelnik<< "  понеделник тренировочный день:";  break;
        case 2: cout << vtornik << "  вторник тренировочный день:"; break;
        case 3: cout << sreda << "  среда тренировочный день:";   break;
        case 4: cout << chetverg << "  четверг тренировочный день:";    break;
        case 5: cout << pyatnica << "   пятница тренировочный день:";   break;
        }
    }
 
    return 0;
}
int ochko(int &a, int &b){
    do {
        for (int a(0); a <= 5; a++){
 
            for (int a(1); a <= 3; a++){
                karti[1][a] = rand() % 11 + 1;
            }
 
            for (int a(1); a <= 3; a++){
                karti[2][a] = rand() % 11 + 1;
            }
 
 
            cout << "\t\t" << igrok1 << ":= " << karti[1][1] << "  " << karti[1][2] << "  " << karti[1][3] << " сумма выпавших карт  игрока 1: " << karti[1][1] + karti[1][2] + karti[1][3] << endl;
            cout << "\t\t" << igrok2 << ":= " << karti[2][1] << "  " << karti[2][2] << "  " << karti[2][3] << " сумма выпавших карт  игрока 2: " << karti[2][1] + karti[2][2] + karti[2][3] << endl;
            if ((karti[1][1] + karti[1][2] + karti[1][3]) > 21 && (karti[2][1] + karti[2][2] + karti[2][3]) > 21 || (karti[1][1] + karti[1][2] + karti[1][3]) == (karti[2][1] + karti[2][2] + karti[2][3])){
                cout << "ничья: \n";
            }
            else if ((karti[1][1] + karti[1][2] + karti[1][3]) > 21){
                cout << " проиграл игрок 1 \n";
            }
            else  if ((karti[2][1] + karti[2][2] + karti[2][3]) > 21) {
                cout << " проиграл игрок 2\n";
            }
            else if ((karti[1][1] + karti[1][2] + karti[1][3]) > (karti[2][1] + karti[2][2] + karti[2][3])){
                cout << " выграл игрок 1\n";
            }
            else {
                cout << " выграл игрок 2\n";
            }
            system("pause");
            system("cls");
        }
 
        cout << "хотите продолжить, нажмите 1: ";
        cin >> b;
 
        system("cls");
    } while (b == 1);
    
    return 0;
}
int bazadanih(danie *structura, int &a){
    do {
        cout << "ведите имя \n";
        cin >> (*structura).imiy;
        cout << "ведите день рожднения в формате 00 \n";
        cin >> structura->denroj;
        cout << "ведите месяц рожднения в формате 00 \n";
        cin >> structura->mes;
        cout << "ведите год рожднения в формате 0000 \n";
        cin >> structura->god;
        ofstream fout;
        
        fout.open("C://tetrad.txt", ios::app);
        
        
        cout << "********************************* \n";
        cout << (*structura).imiy << endl;
        cout << structura->denroj << "." << structura->mes << "." << structura->god << endl;
        cout << "********************************* \n";
        
        fout << "#####################################\n";
        fout <<"имя: "<< (*structura).imiy << endl;
        fout << "день.месяц.год рождения: " << structura->denroj << "." << structura->mes << "." << structura->god << endl;
        fout << "#####################################\n";
        fout.close();
 
        system("pause");
        system("cls");
        cout << "ведите число один, для повторного вода данных:";
        cin >> a;
    } while (a == 1);
    return 0;
}
int chteniebz(danie *structura, int &a){
    ifstream fin;
    fin.open("C://tetrad.txt");
    if (!fin.is_open()){ // даная запись говорит если нет данного файла, то вывести на экран сообщение 
        cout << "Файл не может быть открыт!\n";
    }
    else
    {
        do {
            fin >> structura->schitivanie;//такая запись считывает только одно слово с файла
            cout << structura->schitivanie << endl;
            fin.getline(structura->schitivanie, 50); // такая запись считывает всю строку с файла
            fin.close();
            cout << structura->schitivanie << endl;
            _getch();
            cout << "ведите число 1 для повторного считывания";
            cin >> a;
            system("cls");
 
        } while (a ==1);
        
    }
    return 0;
}
int vod(danie *structura, int &a, int &b, int &c){
    cout << "выберите операцию:  \n" ;
        cout << "1-ввод имени и деньрождения в базу данных.\n"; 
        cout << "2-считывание файла из базы данных";
        cout << "3-калькулятор.\n";
        cout << "4-игра кости.\n";
        cout << "5-игра в очко.\n";
        cout << "6-ваше расписание.\n";
        
        
    cin >> a;
    switch (a)
    {
    default:
    case 1:bazadanih(structura, a); break;
    case 2: chteniebz(structura, a); break;
    case 3:kalkulyator(a, b, c); break;
    case 4:kosti(a, b, c);  break;
    case 5:ochko(a, b); break;
    case 6:raspisanie(a); break;
    
    
    }
 
    return 0;
}
 
int main(danie structura){
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
    int a, b, c;
    
    
    
    vod(&structura, a, b, c);
    
        
    
        
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2015, 15:39
Ответы с готовыми решениями:

Программа считывает только первую строку файла,как сделать чтобы она считывала все строки
#include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; int main(int argc, char* argv) { setlocale(LC_ALL, &quot;rus&quot;); ...

Что считывает ifstream: слово до пробела или полностью строку?
если я запишу вот так, то что будет считываться в данном случае string temp; ifstream fread(&quot;C:\\project\\test.txt&quot;); ...

Ifstream читает из файла только первую запись, вылетает
ifstream читает из файла только первую запись, вылетает при попытке вытащить из файла данные, начиная со второго. ifstream fread...

10
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
29.09.2015, 16:07
Ну так правильно делаешь fin.getline, только надо же пройтись по всему файлу а не считать первое слово
C++
1
if (!fin.eof())
ну или
C++
1
while(fin)
1
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275
29.09.2015, 16:16  [ТС]
пожалуста покажи как это применят. я новичок и еще не разбираюсь. что означает eof и fin
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
29.09.2015, 16:20
C++
1
2
3
4
5
6
7
8
do {
           
            fin.getline(structura->schitivanie, 50); // такая запись считывает всю строку с файла
            cout << structura->schitivanie << endl;
            fin.close();
            _getch();
 
        } while (fin);
Ну это в лоб не проверял
1
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275
29.09.2015, 16:23  [ТС]
попробовал но все равно считывает только первую строку
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
29.09.2015, 16:29
Лучший ответ Сообщение было отмечено mercurygermes как решение

Решение

C++
1
2
3
4
5
6
while (!fin.eof())
{
 fin >> structura->schitivanie;
cout << structura->schitivanie << endl;
}
fin.close();
Вариант 2
1
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275
29.09.2015, 17:24  [ТС]
записанные данные через чар не читает. в этом проблема. попробуй включить файл у себя. введенные данные через char не может прочитать. пример
#####################################
имя: папа
день.месяц.год рождения: 28.7.1960
#####################################
#####################################
имя: мама
день.месяц.год рождения: 30.6.1959
#####################################
из выше перечисленного читает
так
#####################################
имя:
день.месяц.год рождения:
#####################################
#####################################
имя:
день.месяц.год рождения:
#####################################
хотя в данных есть все

Добавлено через 52 минуты
файле информация записана так:
#####################################
имя: папа
день.месяц.год рождения: 28.7.1960
#####################################

а считывает файл вот так:
#####################################
имя:
день.месяц.год рождения:
#####################################

вопрос. как сделать чтобы чтение происходило по первому типу


здесь файл должен водится:
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
int bazadanih(danie *structura, int &a){
    do {
        cout << "ведите имя \n";
        cin >> (*structura).imiy;
        cout << "ведите день рожднения в формате 00 \n";
        cin >> structura->denroj;
        cout << "ведите месяц рожднения в формате 00 \n";
        cin >> structura->mes;
        cout << "ведите год рожднения в формате 0000 \n";
        cin >> structura->god;
        ofstream fout;
        
        fout.open("C://tetrad.txt", ios::app);
        
        
        cout << "********************************* \n";
        cout << (*structura).imiy << endl;
        cout << structura->denroj << "." << structura->mes << "." << structura->god << endl;
        cout << "********************************* \n";
        
        fout << "#####################################\n";
        fout <<"имя: "<< (*structura).imiy << endl;
        fout << "день.месяц.год рождения: " << structura->denroj << "." << structura->mes << "." << structura->god << endl;
        fout << "#####################################\n";
        fout.close();
 
        system("pause");
        system("cls");
        cout << "ведите число один, для повторного вода данных:";
        cin >> a;
    } while (a == 1);
    return 0;
}
здесь программа должна считывать файл:
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
int chteniebz(danie *structura, int &a){
    ifstream fin;
    fin.open("C://tetrad.txt");
    if (!fin.is_open()){ // даная запись говорит если нет данного файла, то вывести на экран сообщение 
        cout << "Файл не может быть открыт!\n";
    }
    else
    {
        do {
            while (!fin.eof()){
                fin >> structura->schitivanie;//такая запись считывает только одно слово с файла
                cout << structura->schitivanie << endl;
                fin.getline(structura->schitivanie, 50); // такая запись считывает всю строку с файла
            }
                fin.close();
                cout << structura->schitivanie << endl;
                _getch();
                cout << "ведите число 1 для  считывания";
                cin >> a;
                system("cls");
             /*if (!fin.eof())
 или такая запись 
while(fin.eof())
 для чтения всего файла*/
 
        } while (a == 1);
        
    }
    return 0;
}
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
29.09.2015, 19:35
Делай vector строк вместо char, а затем считывай проходя итератором по вектору
0
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275
29.09.2015, 19:39  [ТС]
пожалуста покажи на примере. кстати почему чар нельзя использовать? для чего нужен чар?
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
30.09.2015, 09:07
Лучший ответ Сообщение было отмечено mercurygermes как решение

Решение

Почему нельзя можно и нужно, только когда известен размер файла, у тебя выделено всего 50 символов для буфера(длина одной строки у тебя 50 символов)
В начале файла определи #define MAX_BUFF 5000
C++
1
2
3
4
5
6
7
struct danie {
    
    char imiy[20], schitivanie[MAX_BUFF];
    int denroj;
    int mes;
    int god;    
};
А вот если кол-во символов(размер файла) заранее не известен то тогда уже используются вектора или применяются malloc, realloc

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
fgets(schitivanie,MAX_BUFF,fin);
while(!fin.eof())
{
cout << structura->schitivanie << endl;
fgets(schitivanie,MAX_BUFF,fin);
}
fin.close();
Итак можно тоже построчно считать
1
1 / 3 / 0
Регистрация: 26.09.2015
Сообщений: 275
30.09.2015, 21:52  [ТС]
спасибо игорь, я сейчас попробую и отпишусь. а как работать с векторами? и что означает макс буф

Добавлено через 9 минут
спасибо игорь за поддежку и потраченное время. но у меня проблема сохранилась на том же уровне.
должно считывать файл вот так.
#####################################
имя: мама
день.месяц.год рождения: 30.6.1959
#####################################



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

внутри файла инфорция записана по первому типу. но не считывает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2015, 21:52
Помогаю со студенческими работами здесь

Напишите программу, которая считывает первую строку целого числа N
Напишите программу, которая считывает первую строку целого числа N. После вступления читает N линий, каждая из которых содержит одно целое...

ifstream считывает 0
Здравствуйте. Есть 2 текстовых файла с названиями n.in n.out .Содержимое входящего файла 1 5 2 4 3 9 4 7 5

Дана строка. Создать новую строку, все буквы которой входят в первую строку только один раз
Дана строка. Создать новую строку, все буквы которого входят в первую строку только один раз. Помогите разобрать задачку которая должна...

Программа выводит только первую строку текста
// yourcat.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

Неожиданное поведение программы: std::getline считывает строку только раз и на этом программа завершается (найти ошибку)
Строку считывает только раз и на этом программа завершается Code::blocks 17.12 #include &lt;iostream&gt; #include &lt;string&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru