Форум программистов, компьютерный форум CyberForum.ru

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

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

Работа с текстовым файлом. Удаление строки. - C++

03.07.2013, 13:33. Просмотров 991. Ответов 20
Метки нет (Все метки)

День добрый.такой вопрос:мне нужно удалять из файла строчку с данными,если есть совпадение с введенной строкой.то есть,если я ввожу фамилию и такая фамилия есть в строке файла,который я открываю,то эту строчку нужно удалить.ПРоблема в том,что я не знаю,как удалить нужную строчку.И еще- вылезает запись "введите фамилию" столько раз,сколько записей в файле.а нужно по идее просто один раз ввести фамилию и чтоб по строчкам пройтись и найти такую подстрочку.Все строчки,в которых нет совпадений,я записываю в новый файл...помогите пожалуйста разобраться
ВОТ мой код:
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
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include < conio.h>
#include <iostream>
#include <string.h>
#include "locale.h"
using namespace std;
 
 
void main ()
{
    setlocale(LC_ALL, "Russian");
    system("cls");  // Очистка экрана
    int a,b=1;
    char famil2[30];
    char famil[20];
    char imya[30];
    char otchest[30];
    int nomer;
    int ocenki;
    int i,o,p=1;
    int count=1;
    char s[200];
    FILE*t,*nf;
    t=fopen("D:\\программирование\\прога\\tenis\\tenis\\student.txt","r+");
    if((t=fopen("D:\\программирование\\прога\\tenis\\tenis\\student.txt","r+"))==NULL)
        {printf("Ошибка при открытии файла.\n");
            exit(1);
        }
    nf=fopen ("temp.txt","w");//создаю новый файл для записи внего строк,в которых нет совпадений с введенной фамилией
 
        
    while(!feof(t))
        {
            printf("Введите фамилию: ");
            scanf("%s",famil2);
            if (fgets(s,200,t))
            {
                if(s==famil2)//если в строке есть такая фамилия
                {
                char*stud;
                stud=strstr(s,famil2);//функция поиска подстрок в строке
                //не знаю,как удалить строку???
                }
                if (s!=famil2)//если нет совпадений
                    fputs(s,nf);//записываю строку в новый временный 
            }
        }
    fclose (t);
    fclose (nf);
    remove("D:\\программирование\\прога\\tenis\\tenis\\student.txt");//удаляю прежний файл с данными(но он не удаляется почему-то)
    rename ("temp.txt","stud.txt");//переименовываю временный файл
            system ("pause");
            fclose(t);
            
            
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 13:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с текстовым файлом. Удаление строки. (C++):

Работа с текстовым файлом (записать в файл строки и символы в строках в обратном порядке) - C++
Всем привет. Извиняюсь может повторяюсь с задачей, но все же... Задача: Дан txt файл с парой строк, нужно создать результирующий файл и...

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

Работа с текстовым файлом - C++
Нужно программа которая добавляет записи в файл вида: - Структура &quot;Спортивная команда&quot;: - название; - город; - количество...

Работа с текстовым файлом - C++
Вот часть кода: void ReadFile(ifstream &amp;fin, int Kol_Ar) { //чтение данных из файла и вывод на консоль CCust *ReadF = new...

Работа с текстовым файлом - C++
Здравствуйте все! Мне очень нужна помощь в написании кода программы для работы с текстовым файлом. Допустим, у меня есть документ.txt...

Работа с текстовым файлом - C++
Здравствуйте ребята, на практических столкнулась с проблемой, необходима ваша помощь) Есть открытый текстовый файл с несколькими строками...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
05.07.2013, 19:24  [ТС] #16
мне сейчас вот что надо:у меня есть исходный файл,в каждой строке которого находится информация о студентах:фио,номер группы,несколько оценок.так вот-надо сделать так,что бы удалялись оценки у выбранного студента,то есть вводишь фио,если есть такое фио в исходном тексте,то у этого студента удаляются оценки
alsav22
05.07.2013, 19:41
  #17

Не по теме:

Цитата Сообщение от studentka2012 Посмотреть сообщение
мне сейчас вот что надо
Надо - делайте.

studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
05.07.2013, 20:04  [ТС] #18
так я и так делаю,не получается(((((((((((
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 04:41 #19

Не по теме:

Цитата Сообщение от studentka2012 Посмотреть сообщение
так я и так делаю,не получается(((((((((((
Не получается, потому что изначально криво сделано. И дальше ещё больше будет не получаться.



Добавлено через 7 часов 55 минут
Кликните здесь для просмотра всего текста
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
 
#define N 30 // N - 1 максимальное количество символов в Ф.И.О.
#define K 5 // количество оценок
 
#pragma pack(push, 1)
struct student
{
    char family [N]; // фамилия
    char name   [N]; // имя
    char otchest[N]; // отчество
    int  date[K];    // оценки
};
#pragma pack(pop) 
 
void add_student();   // добавление записи о студенте
void show_Students(); // вывод данных о студентах
void sort_Students(); // сортировка данных о студентах
void sort_buffer(struct student *buffer, int n); // сортировка буфера
void delete_student();  // удаление записи о студенте
void out_student(struct student *b);  // вывод данных о студенте на консоль
void in_student   (struct student *b); // чтение данных о студенте с консоли
int count_students(FILE *fin);  // подсчёт количества записей в файле
int compare_students(struct student b1, struct student b2); // сравнение данных о студентах на равенство Ф.И.О.
 
void write_student(struct student *b, FILE *fout);    // запись данных о студенте в файл
void read_student (struct student *b, FILE *fin );    // чтение данных о студенте из файла
struct student* read_to_buffer(int *n);               // создание буфера и чтение данных о студентах в буффер
int write_from_buffer(struct student *buffer, int n); // запись данных о студентах из буффера
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    int k = 0; // пункт меню
    do
    {
        printf("\n1. Добавить запись\n");
        printf("2. Показать все записи\n");
        printf("3. Сортировать записи\n");
        printf("4. Удалить запись\n");
        printf("5. Выход\n");
        
        scanf("%d", &k);
                getc(stdin);
        switch(k)
        {
            case 1: add_student(); 
                break;
            
            case 2: show_Students(); 
                break;
            
            case 3: sort_Students();
                break;
                        
            case 4: delete_student();
                break;
        }
    } while(k != 5 );
 
    return 0;
}
 
//.................................................................................
 
 
void add_student()  // добавление записей
{
  printf("\n\nКоличество добавляемых записей = ");
  int t; // количество добавляемых записей
  scanf("%d", &t);
  getc(stdin);
  if (t <= 0) return;
 
  //запись в файл
  FILE *fout;
  fout = fopen("Students.txt", "ab"); // открываем файл для бинарной дозаписи в конец файла, 
                                      // если файла нет, то создаётся
  struct student temp;
  int i;
  for(i = 0; i < t; i++) // чтение во временную структуру и запись в файл
  {  
     in_student(&temp);
         write_student(&temp, fout);
  }
  fclose(fout); 
}
 
//......................................................................................
 
void show_Students() // вывод данных о студентах
{ 
  FILE *fin;
  fin = fopen("Students.txt", "rb"); // открываем файл для бинарного чтения
  if (!fin) printf("\nДанных не существует.\n\n"); // если файла не существует
  else
  {
          int n = count_students(fin); // количество записей в файле
          struct student temp;
          int j = 0;
          int i;
          for (i = 0; i < n; ++i) // чтение записей и вывод на экран
          {  
                read_student(&temp, fin);
                printf("     %d\n\n", ++j);
                out_student(&temp);
          }
          fclose(fin);
   }
}
 
//.................................................................................
 
void sort_Students() // сортировка данных по фамилии 
{
   int n;
   struct student *buffer = read_to_buffer(&n); // создание буфера и чтение в него данных
   if (!buffer) return;
   
   // сортировка записей в буфере
        sort_buffer(buffer, n);   
        
        if (write_from_buffer(buffer, n)) // запись в файл отсортированного буфера
        {
                printf("\nДанные отсортированы по фамилии!\n");
                show_Students();
        }
                
        free(buffer);
}
 
//..........................................................................
 
void delete_student() // удаление записи о студенте
{
        int n; // количество записей в буфере
        struct student *buffer = read_to_buffer(&n); // создание буфера и чтение в него данных из файла
        if (!buffer) return;
   
        printf("Введите Ф.И.О. студента для удаления:\n");
        struct student b_delete;
        
        printf( "\nФамилия: "); gets(b_delete.family);
        printf( "Имя: ");       gets(b_delete.name);      
        printf( "Отчество: ");  gets(b_delete.otchest);  
       
        int flag = 0;
        int ind; // индекс записи для удаления в буфере
        int i;
        for (i = 0; i < n; ++i) // поиск в буфере записи для удаления
        {  
                if (compare_students(buffer[i], b_delete))
                { 
                        flag = 1; // если найдена запись для удаления, то устанавливаем flag
                        ind = i;  // запоминаем индекс записи в буфере
                        break;
                }
        }
        if (flag == 0) 
        {
                printf("\nТакая запись не найдена\n");
                        
                free(buffer);
                return;
        }
        else // перезаписываем файл 
        {
                int i;
                for (i = ind; i < n - 1; i++) // смещаем буфер на один элемент влево
                        buffer[i] = buffer[i + 1];
                
                write_from_buffer(buffer, n - 1); // записываем буфер в файл
                
                free(buffer);
                
                printf("\nЗапись удалена!\n");
        }
}
 
//........................................................................
 
void write_student(struct student *b, FILE *out) // запись данных о студенте в файл 
{
        fwrite(b, sizeof(struct student), 1, out);
}
 
//......................................................................
 
void read_student(struct student *b, FILE *in) // чтение данных о студенте из файла 
{
        fread(b, sizeof(struct student), 1, in);
}
 
//........................................................................
 
void out_student(struct student *b) // вывод данных о студенте на консоль
{
        puts(b ->family);       
        puts(b ->name);       
        puts(b ->otchest);    
        int i;
        for (i = 0; i < K; ++i)               
            printf("%d ", b ->date[i]); 
        puts("\n");
}
 
//........................................................................
 
void in_student(struct student *b) // ввод данных о студенте c консоли
{
        printf( "\nФамилия: "); gets(b ->family);
        printf( "Имя: ");       gets(b ->name);      
        printf( "Отчество: ");  gets(b ->otchest);  
        printf( "Оценки (%d):\n", K);
        int i;
        for (i = 0; i < K; ++i)
        {
            printf( "%d) ", i + 1);
            scanf("%d", &b ->date[i]);
        }
        getchar();
}
 
//.......................................................................
 
int count_students(FILE *fin) // подсчёт количества записей в файле
{
        fseek(fin, 0, SEEK_END); // перемотать на конец файла
        long file_size = ftell(fin); // получить размер файла
        long n = file_size / sizeof(struct student); // количество записей в файле
        fseek (fin , 0, SEEK_SET); // перемотать на начало файла
        
        return n;
}
 
//.......................................................................
 
int compare_students(struct student b1, struct student b2) // сравнение данных о студентах (Ф.И.О.)
{
    if ((!strcmp(b1.family,  b2.family ))  &&
        (!strcmp(b1.name,    b2.name  ))   &&
        (!strcmp(b1.otchest, b2.otchest))) 
    return 1;
    else return 0;
}
 
//........................................................................
 
struct student* read_to_buffer(int *n) // создание буфера и чтение файла в буффер
{
  FILE *fin;
  fin = fopen("Students.txt", "rb"); // открываем файл для бинарного чтения
  if (!fin) 
  {
        printf("\nДанных не существует.\n\n"); // если файла не существует
        return NULL;
  }
  else
  {
        *n = count_students(fin); // количество записей в файле
        struct student *buffer = (struct student*)malloc(*n * sizeof(struct student));  // память под буфер
                
        if (!buffer)
        {
                printf("\nНедостаточно памяти!\n");
                fclose(fin);
                return buffer;
        }
                
        fread(buffer, sizeof(struct student), *n, fin); // читаем файл в буфер
        fclose(fin);
                
        return buffer;
   }
}
 
//............................................................................
 
int write_from_buffer(struct student *buffer, int n) // запись в файл из буффера
{
  FILE *fout;
  fout = fopen("Students.txt", "wb"); // открываем файл для бинарной записи
  if (!fout) 
  {
        printf("\nОшибка при открытии файла для записи!.\n\n");
        return 0;
  }
  
  fwrite(buffer, sizeof(struct student), n, fout);
  fclose(fout);
  
  return 1;
}
 
//.......................................................................
 
void sort_buffer(struct student *buffer, int n) // сортировка буфера по фамилии студентов
{
        struct student temp;
        int i;
        for(i = 0; i < n - 1; ++i)
        {
                int j;
                for(j = 0; j < n - 1; ++j)
                {
                        int cmp;
                        cmp = strcmp(buffer[j].family, buffer[j + 1].family);
                        if(cmp > 0)
                        {
                                temp = buffer[j + 1];
                                buffer[j + 1] = buffer[j];
                                buffer[j] = temp;
                        }
                }
        }
}
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
06.07.2013, 05:46  [ТС] #20
alsav22,спасибо Вам большое)
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 20:07 #21
Можно добавить ещё вывод нужной записи и изменение оценок нужной записи:
Кликните здесь для просмотра всего текста
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
void find_student();   // поиск и вывод нужной записи о студенте 
void change_student(); // изменить оценки в записи о студенте
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    int k = 0; // пункт меню
    do
    {
        printf("\n1. Добавить запись\n");
        printf("2. Показать все записи\n");
        printf("3. Сортировать записи\n");
        printf("4. Найти запись\n");
        printf("5. Удалить запись\n");
        printf("6. Изменить оценки в записи\n");
        printf("7. Выход\n");
        
        scanf("%d", &k);
                getc(stdin);
        switch(k)
        {
            case 1: add_student(); 
                break;
            
            case 2: show_Students(); 
                break;
            
            case 3: sort_Students();
                break;
                
            case 4: find_student();
                break;  
                        
            case 5: delete_student();
                break;
 
            case 6: change_student();
                break;
        }
    } while(k != 7 );
 
    return 0;
}
 
void find_student()
{
    FILE *fin;
    fin = fopen("Students.txt", "rb"); // открываем файл для бинарного чтения
    if (!fin) printf("\nДанных не существует.\n\n"); // если файла не существует
    else
    {
        int n = count_students(fin); // количество записей в файле
        if (n == 0)
        {
            printf("\nДанных не существует.\n\n");
            return;
        }
 
        printf("Введите Ф.И.О. студента для поиска:\n");
        struct student s_find;
        
        printf( "\nФамилия: "); gets(s_find.family);
        printf( "Имя: ");       gets(s_find.name);      
        printf( "Отчество: ");  gets(s_find.otchest);  
       
        int i;
        int j = 0;
        int flag = 0;
        struct student temp;
        for (i = 0; i < n; ++i) // чтение записей и вывод на экран нужной
        {  
            read_student(&temp, fin);
            if (compare_students(temp, s_find))
            { 
                flag = 1; // если найдена нужная запись, то устанавливаем flag
                printf("     %d\n\n", ++j);
                out_student(&temp); // выводим найденную запись
            }
        }
        fclose(fin);
        
        if (flag == 0) printf("\nТакая запись не найдена!\n");
    }
}
 
 
void change_student()
{
    int n; // количество записей в буфере
    struct student *buffer = read_to_buffer(&n); // создание буфера и чтение в него данных из файла
    if (!buffer) return;
   
    printf("Введите Ф.И.О. студента:\n");
    struct student s_change;
        
    printf( "\nФамилия: "); gets(s_change.family);
    printf( "Имя: ");       gets(s_change.name);      
    printf( "Отчество: ");  gets(s_change.otchest);  
       
    int flag = 0;
    int q = 0;
    int i;
    for (i = 0; i < n; ++i) // поиск в буфере записи для изменения
    {  
        if (compare_students(buffer[i], s_change))
        { 
            flag = 1; // если найдена нужная запись, то устанавливаем flag
            printf("     %d\n\n", ++q);
            out_student(&buffer[i]); // выводим найденную запись
                   
            printf("\nВведите новые оценки (%d):\n", K);
            int j;
            for (j = 0; j < K; ++j)
            {
                printf( "%d) ", j + 1);
                scanf("%d", &buffer[i].date[j]);
            }
                
            printf("\nЗапись изменена!\n\n");
        }
    }   
    
    if (flag == 1) write_from_buffer(buffer, n); // записываем буфер в файл
    
    if (flag == 0) printf("\nТакая запись не найдена!\n");
    
    free(buffer);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 20:07
Привет! Вот еще темы с ответами:

Работа с текстовым файлом - C++
Добрый вечер, помогите пожалуйста с решением следущей проблемы: Есть текстовый файл, в котором находится 40 000 различных английских...

Работа с текстовым файлом - C++
Дан текстовый файл, имеющий более 3х строк. Задание: удалить из файла последние три строки. Заранее спасибо всем, кто поможет.

Работа с текстовым файлом - C++
Ниже представлен код программы, которая ищет символ заданный пользователем в txt файле (&quot;input.txt&quot;), и те строки текста где находится этот...

Работа с текстовым файлом - C++
Здравствуйте. Имеется текстовый файл, в котором известно количество очков, набранных каждой из 19 команд-участниц первенства по футболу....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.07.2013, 20:07
Ответ Создать тему
Опции темы

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