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

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

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

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

03.07.2013, 13:33. Просмотров 1038. Ответов 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);
            
            
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
Здравствуйте ребята, на практических столкнулась с проблемой, необходима ваша помощь) Есть открытый текстовый файл с несколькими строками...

20
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.07.2013, 16:08 #2
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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
int main(int argc, char** argv) 
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
   
   std::ifstream ifs("D:/file.txt");
   if (ifs.is_open())
   {
      std::ofstream ofs("D:/result.txt");
      std::string finding_world;
      std::cout<<"Введите нужное слово:->"; std::cin>>finding_world;
      finding_world += " "; finding_world.insert(0, " ");
      std::string line;
      while (std::getline(ifs, line))
      {
         if (line.find(finding_world) == std::string::npos)
            ofs<<line<<'\n';
      }
   }
   else
      std::cerr<<"Ошибка открытия файла(ов).\n";
 
   return 0;
}
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 18:34 #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
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include "locale.h"
using namespace std;
 
 
int 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 == NULL)
    {
        printf("Ошибка при открытии файла.\n");
        system ("pause");
        exit(1);
    }
    nf = fopen ("stud.txt", "w");//создаю новый файл для записи в него строк, в которых нет совпадений с введенной фамилией
    
    printf("Введите фамилию: ");
    scanf("%s",famil2);
    int flag = 0;
    while(!feof(t))
    {
        if (fgets(s, 200, t))
        {
            char temp[30];
            int i = 0;
            while (sscanf(s + i, "%s", temp))
            {
                if (!strcmp(famil2, temp)) 
                {
                    flag = 1;
                    break;
                }
                i += strlen(temp) + 1;
                if (i >= strlen(s)) break;
            }
            
            if (!flag) //если нет совпадений
                fputs(s, nf); //записываю строку в новый временный
            flag = 0;
        }
    }
    fclose (t);
    fclose (nf);
    
    remove("D:\\программирование\\прога\\tenis\\tenis\\student.txt");//удаляю прежний файл с данными(но он не удаляется почему-то)
    
    system ("pause");
    return 0;
}
0
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
03.07.2013, 18:40  [ТС] #4
не совсем поняла ваш код..Попыталась его скомпилировать,но выдал много ошибок..просто мне б мой код отредактировать.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 18:42 #5
Цитата Сообщение от studentka2012 Посмотреть сообщение
не совсем поняла ваш код..
Чей?
1
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
03.07.2013, 18:47  [ТС] #6
alsav22,СПАСИБО БОЛЬШОЕ))ПРОСТО КЛАСС))
0
alsav22
03.07.2013, 18:55
  #7

Не по теме:

Цитата Сообщение от studentka2012 Посмотреть сообщение
СПАСИБО БОЛЬШОЕ
На здоровье!

0
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
03.07.2013, 22:52  [ТС] #8
а вот такая ситуация возникла-если вводить не только фамилию,то есть еще и имя,и отчество вводить.и искать в строках все эти данные.то как это реализовать?заранее спасибо
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 23:27 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
    printf("Введите фамилию: ");
    scanf("%s",famil2);
    printf("Введите имя: ");
    scanf("%s",imya);
    printf("Введите отчество: ");
    scanf("%s",otchest);
...
 
    while (sscanf(s + i, "%s", temp))
    {
        if (!strcmp(famil2, temp) || !strcmp(imya, temp) || !strcmp(otchest, temp)) 
        {
            flag = 1;
            break;
        }
        i += strlen(temp) + 1;
        if (i >= strlen(s)) break;
    }
...
1
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
04.07.2013, 12:20  [ТС] #10
можете еще немного подсобить))Мне надо теперь добавлять и удалять оценки для выбранного студента,то есть ищу по ФИО.В моем коде я пока пытаюсь хотя бы добавить оценки для выбранного студента,и у меня получается,что при совпадении записывается строчка и я дописываю оценку,но эти новые оценки идут в новую строку,а надо чтоб в ту же строчку,то есть для одного студента всё в одну строчку.И получается,если я создаю новый файл,куда записываю студентов с совпавшими ФИО и дописываю к ним оценки,то в этот же файл мне надо записать тех студентов,фио которых не совпали,просто без изменения их записать в новый файл.(ну а про удаление оценок у выбранных студентов вообще молчу)
Код:
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
#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 imya2[30];
    char otchest[30];
    char otchest2[30];
    int nomer;
    int ocenki;
    int i, o, p = 1;
    int count = 1;
    char s[200];
    char dob[100];
    FILE *t, *nf;
    t = fopen("D:\\программирование\\прога\\tenis\\tenis\\student.txt", "r+");
    if(t == NULL)
    {
        printf("Ошибка при открытии файла.\n");
        system ("pause");
        exit(1);
    }
    
    nf = fopen ("stud.txt", "w+");//создаю новый файл для записи в него строк, в которых нет совпадений с введенной фамилией
    printf("Введите фамилию: ");
    scanf("%s",famil2);
    printf("Введите имя: ");
    scanf("%s",imya2);
    printf("Введите отчество: ");
    scanf("%s",otchest);
    int flag = 0;
    while(!feof(t))
    {
        if (fgets(s, 200, t))
        {
            
            char temp[30];
            int i = 0;
            while (sscanf(s + i, "%s", temp))
                {
                    if (!strcmp(famil2, temp) || !strcmp(imya, temp) || !strcmp(otchest, temp)) 
                     {
                         
                         printf("Введите оценку: ");
                         scanf ("%d", &ocenki);
                        sprintf(dob,"%d |",ocenki);
                        while(1)//бесконечный цикл для ввода оценок
                        {
                            printf("Ввести еще оценку? (1-да, 2-выход) ");
                            scanf ("%d",&p);    
                            if (p==1)
                            {
                                printf ("Введите следующую оценку: ");
                                scanf ("%d", &ocenki);
                                sprintf(dob,"%d |",ocenki);
                                sprintf(dob," ");
                            }
                            else break;
                        }
                    i += strlen(temp) + 1;
                    if (i >= strlen(s)) break;
                    strcat(s,dob);
                    fputs(s,nf);    
                     }
                    else fputs(s,nf);//если нет совпадений
                    break;
                 }
            
            if (!flag)
            
                break; 
            flag = 0;
        }
    }
    fclose (t);
    fclose (nf);
    
    
    
    system ("pause");
    
}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2013, 18:33 #11
Всё это, вообще-то, не так делается, а через структуры и операции с ними. На форуме много таких тем. Поиск используйте. Вот здесь, например, почитайте: создать структуру, элементами которой являются фамилия студента и его возраст
0
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
05.07.2013, 12:30  [ТС] #12
Сделала добавление оценок.теперь надо удалять их у выбранного студента.

Добавлено через 1 час 3 минуты
Скажите пожалуйста,как мне записать в новый файл из старого только часть строки.то есть без оценок?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 18:32 #13
Почему через структуры не хотите делать? Будет всё криво. То, что у вас в коде, это не поиск нужного студента, а поиск записи, в которой есть или искомая фамилия, или имя, или отчество, но не все три вместе.
0
studentka2012
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 20
05.07.2013, 18:40  [ТС] #14
alsav22,просто я вообще со структурами не работала.. и разбираться времени нет.скоро практику сдавать уже надо.я вот застряла на удалении оценок,а потом мне надо будет еще из исходного текста искать студентов с одним номером группы и записывать в новый файл,высчитывая их средний балл
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 18:58 #15
Цитата Сообщение от studentka2012 Посмотреть сообщение
я вот застряла на удалении оценок,а потом мне надо будет еще из исходного текста искать студентов с одним номером группы и записывать в новый файл,высчитывая их средний балл
Если не делать нормально, то застрянете навсегда.

Добавлено через 45 секунд
Задание как звучит?
0
05.07.2013, 18:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 18:58
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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