3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
1

Удаление от символа до символа с заданной позиции

22.11.2012, 00:51. Показов 1548. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
подскажите как удалить из файла строку от символа до символа с заданной позиции
Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2012, 00:51
Ответы с готовыми решениями:

Получить индекс позиции символа строки на которую ссылается указатели fpos, npos
#define START "777" #define END "888" char string ="werertdxc777dh asdgasdfaefxbfghs888df...

Для символа С вывести два символа
Для символа С вывести два символа, первый из которых предшествует символу С в кодовой таблице, а...

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

Удаление символа из строки
Задача такова: Даны символы s1,s2,... Известно, что символ s1 отличен от пробела и что среди...

7
Эксперт С++
5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.11.2012, 10:37 2
C
1
memmove(str + from, str + to, strlen(str + to) + 1);
Где удаляются все символы, чьи индексы попадают в диапазон [from, to).

Либо, если from и to - это указатели на соответствующие символы:

C
1
memmove(from, to, strlen(to) + 1);
1
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
22.11.2012, 12:28  [ТС] 3
Цитата Сообщение от Nameless One Посмотреть сообщение

Кликните здесь для просмотра всего текста

C
1
memmove(str + from, str + to, strlen(str + to) + 1);
Где удаляются все символы, чьи индексы попадают в диапазон [from, to).

Либо, если from и to - это указатели на соответствующие символы:

C
1
memmove(from, to, strlen(to) + 1);


написал вот такой код

Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <stdlib.h>
#define bufferSize 8192
 
int main(int argc,char *argv[]) {
 
 FILE *iF,*oF;
 char *buffer,c;
 int cursor;
 int temp=0,begin=0,end=0;
 
 buffer = (char*)malloc(bufferSize * sizeof(char));
 if (buffer == NULL) {
  printf("Не удается выделить память\n");
 }
 iF = fopen("lab3.in","r");
 if (iF == NULL) {
  printf("Файл lab3.in не существует\n"); // приглашение на ввод
  return -1;
 }
 int i;
 for (i=0; i<bufferSize;++i) { 
  if (fscanf(iF,"%c",buffer+i) != 1) break; 
//  printf("%c ",buffer[i]); 
 } 
 while (cursor<=bufferSize) {
 if  ((buffer[cursor]==' ') || (buffer[cursor]=='\0')) //нахождение самого длинного
  if (cursor - temp >= end - begin) {
   begin = temp;
   end = cursor;
   temp = cursor;
  } else temp = cursor;
  cursor++;
 }
 end=end-begin;
 printf("begin: %d, length: %d \n",begin,end);
 for(cursor=begin;cursor<=bufferSize;cursor++) 
  buffer[cursor]=buffer[cursor+end];
// for (i=0; i<bufferSize;++i) { 
//  printf("%c ",buffer[i]); 
// }  
 oF = fopen("lab3.out","w");
 for (i=0; i<=bufferSize;++i) {
  fputc(buffer[i],oF);
 }
 
 return 0;
}

здесь нахожу нужную часть строки определяя ее начало и конец, далее устанавливаю cursor на начало и подтягиваю символы с адреса cursor + length
не получается открыть полученный файл oF
в чём проблема?
0
Эксперт С++
5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.11.2012, 13:10 4
freeax,
  1. Зачем выделять память под строку динамически, если ее размер известен на этапе компиляции? И если уж создаешь массив динамически, нужно правильно обрабатывать ошибки выделения. А у тебя при ошибке выделения просто выводится сообщение и программа продолжает выполняться дальше, как будто NULL — это валидный указатель
  2. У меня такое впечатление, что комментарии не соответствуют коду
  3. Вместо посимвольного ввода и вывода нужно использовать функции, работающие со строками
  4. cursor хорошо бы инициализировать перед первым использованием
  5. Выложи задание и пример входных данных
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
22.11.2012, 13:40  [ТС] 5
Цитата Сообщение от Nameless One Посмотреть сообщение
freeax,
  1. Зачем выделять память под строку динамически, если ее размер известен на этапе компиляции? И если уж создаешь массив динамически, нужно правильно обрабатывать ошибки выделения. А у тебя при ошибке выделения просто выводится сообщение и программа продолжает выполняться дальше, как будто NULL — это валидный указатель
  2. У меня такое впечатление, что комментарии не соответствуют коду
  3. Вместо посимвольного ввода и вывода нужно использовать функции, работающие со строками
  4. cursor хорошо бы инициализировать перед первым использованием
  5. Выложи задание и пример входных данных
найти наименьшее слово и удалить его

Добавлено через 22 минуты
я с вами полностью согласен, насчет динамического массива, это осталось с того варианта, когда я считывал файл полностью и насчет обработки ошибки тоже ретён бы не помешал. Но все-таки задачу бы решить именно таким способом, найти начальное и конечное положение строки по известным критериям, а потом вырезать подтянув массив к началу
0
Эксперт С++
5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.11.2012, 14:05 6
Цитата Сообщение от freeax Посмотреть сообщение
Но все-таки задачу бы решить именно таким способом, найти начальное и конечное положение строки по известным критериям, а потом вырезать подтянув массив к началу
Так вырезать ничего и не надо, нужно просто в файл НЕ выводить наименьшее слово:

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
    char buf[BUFSIZ];
    FILE *in, *out;
    size_t min;
    char *start, *end, *nstart, *nend;
 
    if(argc != 3)
    {
        fprintf(stderr, "Expected 2 arguments; %d given\n", argc);
        fprintf(stderr, "Usage: %s INFILE OUTFILE\n", argv[0]);
        exit(EXIT_FAILURE);
    }
 
    if((in = fopen(argv[1], "r")) == NULL)
    {
        perror(argv[1]);
        exit(EXIT_FAILURE);
    }
 
    if((out = fopen(argv[2], "w")) == NULL)
    {
        perror(argv[2]);
        exit(EXIT_FAILURE);
    }
 
    if(fgets(buf, BUFSIZ, in) == NULL)
    {
        if(ferror(in))
        {
            perror(argv[1]);
            exit(EXIT_FAILURE);
        }
        else
        {
            fprintf(stderr, "%s: file is empty\n", argv[1]);
            exit(EXIT_SUCCESS);
        }
    }
 
    start = strspn(buf, " \t\n") + buf;
    end = strpbrk(start + 1, " \t\n");
 
    if(end == NULL)
        exit(EXIT_SUCCESS);
 
    min = end - start;
 
    for(nstart = strspn(end, " \t\n") + end, nend = strpbrk(nstart + 1, " \t\n");
        nend != NULL;
        nstart = strspn(nend, " \t\n") + nend, nend = strpbrk(nstart + 1, " \t\n"))
        {
            size_t nmin = nend - nstart;
            if(nmin < min)
            {
                start = nstart;
                end = nend;
                min = nmin;
            }
        }
 
    *start = '\0';
 
    if(fputs(buf, out) == EOF ||
       fputs(end, out) == EOF)
    {
        perror(argv[2]);
        exit(EXIT_FAILURE);
    }
 
    exit(EXIT_SUCCESS);
}
Названия файлов указываются через параметры командной строки:

Bash
1
2
3
4
5
6
~/samples/c $ cat in.txt 
What is the shortest word
~/samples/c $ ./sample in.txt out.txt 
~/samples/c $ cat out.txt 
What  the shortest word
~/samples/c $
1
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.11.2012, 02:47  [ТС] 7
Цитата Сообщение от Nameless One Посмотреть сообщение
Так вырезать ничего и не надо, нужно просто в файл НЕ выводить наименьшее слово:
Я имел ввиду вырезать в буфере и записать в файл, ну да ладно, буду разбираться в вашем коде

Все таки не могу понять с 53ей по 55ю строчки
0
Эксперт С++
5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.11.2012, 10:47 8
Цитата Сообщение от freeax Посмотреть сообщение
Все таки не могу понять с 53ей по 55ю строчки
Цикл for, в нем для каждой итерации ищутся указатели на начало и конец очередного слова: с помощью функции strspn ищется длина сегмента, состоящего из пробельных символов, которая в дальнейшем используется для нахождения указателя на начало слова (путем прибавления к этой длине адреса позиции, от которой происходит поиск); с помощью функции strpbrk ищется указатель на символ, идущий за концом очередного слова.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2012, 10:47
Помогаю со студенческими работами здесь

Удаление из строки символа
Приветствую! Столкнулся с простым заданием, но почему-то мой код не работает)) Пожалуйста...

Удаление символа по нажатию клавиши backspace
в общем у меня есть код #include &lt;malloc.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Функция: удаление из строки символа с заданным номером
Написать функцию, которая удаляет из строки символ с заданным номером

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru