Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
1

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

29.09.2015, 15:39. Просмотров 767. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2015, 15:39
Ответы с готовыми решениями:

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

Что считывает ifstream: слово до пробела или полностью строку?
если я запишу вот так, то что будет считываться в данном случае string...

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

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

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

10
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,038
Завершенные тесты: 1
29.09.2015, 16:07 2
Ну так правильно делаешь fin.getline, только надо же пройтись по всему файлу а не считать первое слово
C++
1
if (!fin.eof())
ну или
C++
1
while(fin)
1
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
29.09.2015, 16:16  [ТС] 3
пожалуста покажи как это применят. я новичок и еще не разбираюсь. что означает eof и fin
0
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,038
Завершенные тесты: 1
29.09.2015, 16:20 4
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
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
29.09.2015, 16:23  [ТС] 5
попробовал но все равно считывает только первую строку
0
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,038
Завершенные тесты: 1
29.09.2015, 16:29 6
Лучший ответ Сообщение было отмечено mercurygermes как решение

Решение

C++
1
2
3
4
5
6
while (!fin.eof())
{
 fin >> structura->schitivanie;
cout << structura->schitivanie << endl;
}
fin.close();
Вариант 2
1
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
29.09.2015, 17:24  [ТС] 7
записанные данные через чар не читает. в этом проблема. попробуй включить файл у себя. введенные данные через 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
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,038
Завершенные тесты: 1
29.09.2015, 19:35 8
Делай vector строк вместо char, а затем считывай проходя итератором по вектору
0
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
29.09.2015, 19:39  [ТС] 9
пожалуста покажи на примере. кстати почему чар нельзя использовать? для чего нужен чар?
0
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,038
Завершенные тесты: 1
30.09.2015, 09:07 10
Лучший ответ Сообщение было отмечено 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
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 180
30.09.2015, 21:52  [ТС] 11
спасибо игорь, я сейчас попробую и отпишусь. а как работать с векторами? и что означает макс буф

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



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

внутри файла инфорция записана по первому типу. но не считывает
0
30.09.2015, 21:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2015, 21:52

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

Программа выводит только первую строку текста
// yourcat.cpp: определяет точку входа для консольного приложения. // ...

Функция fopen() для большого текстового файла читает только первую строку
Есть текстовой файл 4.5 мб, нужно его открыть для чтения из него строк. ...


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

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

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