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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
#1

Удалить из каждой строки файла первые K символов - C++

05.06.2012, 16:08. Просмотров 2662. Ответов 7
Метки нет (Все метки)

Всем привет! Вообщем есть задачка
Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы).

Впринципе не сложная (есть даже её решение на Pascal), но я не знаю аналога в C++ delete(temp,1,k);

Мой код на С++
Код 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 /** Text18. Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы). */ #include <fstream> #define FILE_NAME_1 file1.txt #define FILE_NAME_2 new_file.txt int main(int argc, char ** argv) { int k; std::string buffer; std::ifstream file1("FILE_NAME_1"); std::ifstream file2("FILE_NAME_2"); std::cout << "k -> "; std::cin >> k; if (!file1.is_open()) { std::cerr << "Can't open " << FILE_NAME_1 << " for input!" << std::endl; return 1; } while(!file1.eof()) { file1 >> buffer; ****/** тут должно быть Delete(buffer, 1, k); только на С++ */ ****file2 << buffer; } file1.close(); file2.close(); return 0; }


Решение на Pascal
Код Pascal1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Program Text18; Const add='test.txt'; add1='new.txt'; var f,f2:text; temp:string; k:byte; Begin assign(f,add); assign(f2,add1); reset(f); rewrite(f2); write('Введите k: ');readln(k); while not eof(f)do begin readln(f,temp); delete(temp,1,k); writeln(f2,temp); end; close(f2); close(f); end.


Заранее спасибки!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 16:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить из каждой строки файла первые K символов (C++):

Прочитать первые 10 символов каждой строки из файла - C++
Мне нужно прочитать первые 10 символов каждой строки из файла. Может функция какая есть, чтобы определенное количество символов строки из...

Считать первые 10 символов каждой строки - C++
Здравствуйте! Помогите, пожалуйста, составить программу, которая бы считывала из файла по 10 символов с каждой строчки.Пытался сам,но...

В конец каждой строки текстового файла дописать количество символов этой строки - C++
Помогите, нужно : &quot;В конец каждой строки текстового файла дописать количество символов этой строки&quot;. Получается только в начало, не знаю...

Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2 - C++
помогите написать программу на двух разных классах! 2) Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из этих строк...

Для каждой строки файла удалить короткое слово - C++
Для каждой строки файла удалить короткое слово. Результат записать в файл. FILE *f1,*f2; f1=fopen(&quot;F1.txt&quot;,&quot;rt&quot;); ...

Удалить из i-ой строки файла i первых символов - C++
Дан текстовый файл f, содержащий 20 строк. Нужно удалить из i-ой строки i первых символов. Вот что написал: #include &lt;fstream&gt;; ...

7
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
05.06.2012, 17:55 #2
C++
1
buffer.erase(0, k);
1
Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 15:31  [ТС] #3
Вообщем что то не так... Программа просто не работает (открывается консольное окошко, ввожу имена файлов и тут просто "Прекращена работы программы"
Использовала компилятор GNU GCC, компилировала командой g++ Text18.cpp
Пробовала в RAD Studio сделать, но борландовский компилятор вообще на 34 и 36 строчку начал ругаться
Ошибки RAD Studio
[BCC32 Error] Text18.cpp(34): E2094 'operator>>' not implemented in type 'ifstream' for arguments of type 'std::string'
Full parser context
Text18.cpp(14): parsing: int main(int,char * *)
[BCC32 Error] Text18.cpp(36): E2094 'operator<<' not implemented in type 'ofstream' for arguments of type 'std::string'
Full parser context
Text18.cpp(14): parsing: int main(int,char * *)

Ошибка Windows
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: a.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 4fcf39bb
Имя модуля с ошибкой: libstdc++-6.dll
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 4e71847f
Код исключения: c0000005
Смещение исключения: 00079d4c
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?link...8&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt

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
#include <fstream>
#include <iostream>
 
int main(int argc, char ** argv)
{
  int k;
  
  char * fileName1;
  char * fileName2;
  
  std::cout << "Input file name -> ";
  std::cin >> fileName1;  
  std::cout << "Output file name -> ";
  std::cin >> fileName2;
  
  
  
  std::string buffer;
  std::ifstream file1(fileName1);
  std::ofstream file2(fileName2);
  
  std::cout << "k -> ";
  std::cin >> k;
  
  if (!file1.is_open())
  {
    std::cerr << "Can't open for input!" << std::endl;
    return 1;
  }
  else
  {
    while(!file1.eof())
    {
      file1 >> buffer;
      buffer.erase(0, k);
      file2 << buffer;
    } 
  }
  file1.close();
  file2.close();
  
  return 0;
}
Добавлено через 5 минут
Вроде можно этот кусочек кода
C++
1
2
3
4
5
6
while(!file1.eof())
    {
      file1 >> buffer;
      buffer.erase(0, k);
      file2 << buffer;
    }
реализовать без всяких там >><<... Как это сделать?

P.S. Если не сложно, то напишите, как реализовать file1 >> buffer; и file2 << buffer; по другому

Заранее спасибо))
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
06.06.2012, 15:44 #4
Можно реализовать через getline().
Но проблема раньше. Для строк fileName1 и fileName2 не выделена память. Так что вводить в них ничего нельзя.
Можно их сделать массивами:
C++
1
2
3
4
#include <climits>
// ...
  char fileName1[PATH_MAX];
  char fileName2[PATH_MAX];
Ну или вообще через std::string, как и для содержимого.
1
Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 15:56  [ТС] #5
grizlik78 спасибо, но все равно не работает(((
Код
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
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <climits>
 
/** Text18. Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов
(если длина строки меньше K, то удалить из нее все символы). */
 
 
int _tmain(int argc, _TCHAR* argv[])
{
  int k;
 
  char fileName1[PATH_MAX];
  char fileName2[PATH_MAX];
 
  std::cout << "Input file name -> ";
  std::cin >> fileName1;
  std::cout << "Output file name -> ";
  std::cin >> fileName2;
 
 
 
  std::string buffer;
  std::ifstream file1(fileName1);
  std::ofstream file2(fileName2);
 
  std::cout << "k -> ";
  std::cin >> k;
 
  if (!file1.is_open())
  {
    std::cerr << "Can't open for input!" << std::endl;
    return 1;
  }
  else
  {
    while(!file1.eof())
    {
      file1 >> buffer;
      buffer.erase(0, k);
      file2 << buffer;
    }
  }
  file1.close();
  file2.close();
 
  return 0;
}

Ошибки
[BCC32 Error] Text18.cpp(18): E2451 Undefined symbol 'PATH_MAX'
Full parser context
Text18.cpp(15): parsing: int main(int,char * *)
[BCC32 Error] Text18.cpp(44): E2094 'operator>>' not implemented in type 'ifstream' for arguments of type 'std::string'
Full parser context
Text18.cpp(15): parsing: int main(int,char * *)
[BCC32 Error] Text18.cpp(46): E2094 'operator<<' not implemented in type 'ofstream' for arguments of type 'std::string'
Full parser context
Text18.cpp(15): parsing: int main(int,char * *)


Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Можно реализовать через getline().
Можете набросать пример для моего случая?
Просто у меня беда как раз с чтением и записью в файлы(((
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
06.06.2012, 15:56 #6
Немного не так. Функция getline нужна не от потока, а отдельная. И проверка условия конца файла в заголовке цикла while практически всегда работает неправильно.
Цикл может выглядеть так:
C++
1
2
    while (getline(file1, buffer))
      file2 << buffer.erase(0, k) << std::endl;
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.06.2012, 16:02 #7
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
/** Text18. Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы). */
 
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    int k;
    std::string buffer, filename1, filename2;
    
    std::cout << "k -> ";
    std::cin >> k;
    std::cout << "input filename -> ";
    std::cin >> filename1;
    std::cout << "output filename -> ";
    std::cin >> filename2;
 
    std::ifstream file1(filename1.c_str());
    std::ofstream file2(filename2.c_str());
  
    if (!file1.is_open())
    {
        std::cerr << "Can't open " << filename1 << " for input!" << std::endl;
        return 1;
    }
  
    if (!file2.is_open())
    {
        std::cerr << "Can't create file " << filename2 << " for output!" << std::endl;
        return 1;
    }
 
    while(std::getline(file1, buffer))
    {
        buffer.erase(0, k);
        if (!buffer.empty())
            file2 << buffer << '\n';
    } 
  
    return 0;
}
1
Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 16:11  [ТС] #8
Спасибки Вам огромные!! Все получилось!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 16:11
Привет! Вот еще темы с ответами:

Для каждой строки файла удалить среднее слово; результат записать в файл (файловый ввод/вывод) - C++
для каждой строки файла удалить среднее слово. результат записать в файл

Если строки одинаковы, объединить две строки, исключив из второй первые десять символов - C++
Ввести строки. Сравнить первые десять символов двух строк. Если они одинаковы, объединить две строки, исключив из второй первые десять...

Переписать первые элементы каждой строки матрицы - C++
Народ помогите ,за ранее сапсибо Переписать первые элементы каждой строки матрицы D(3,3), которые больше 10, в массив B.

Удалить первые 16 строк текстового файла - C++
есть текстовый документ...нужно удалить первые 16 строк


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

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

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