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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Ксю92
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
05.06.2012, 16:08     Удалить из каждой строки файла первые K символов #1
Всем привет! Вообщем есть задачка
Дано целое число 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.


Заранее спасибки!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 16:08     Удалить из каждой строки файла первые K символов
Посмотрите здесь:

Переписать первые элементы каждой строки матрицы D(3,3), которые больше 10, в массив В. C++
Прочитать первые 10 символов каждой строки из файла C++
C++ Для каждой строки файла удалить короткое слово
C++ Если строки одинаковы, объединить две строки, исключив из второй первые десять символов
Считать первые 10 символов каждой строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
05.06.2012, 17:55     Удалить из каждой строки файла первые K символов #2
C++
1
buffer.erase(0, k);
Ксю92
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 15:31  [ТС]     Удалить из каждой строки файла первые K символов #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; по другому

Заранее спасибо))
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
06.06.2012, 15:44     Удалить из каждой строки файла первые K символов #4
Можно реализовать через getline().
Но проблема раньше. Для строк fileName1 и fileName2 не выделена память. Так что вводить в них ничего нельзя.
Можно их сделать массивами:
C++
1
2
3
4
#include <climits>
// ...
  char fileName1[PATH_MAX];
  char fileName2[PATH_MAX];
Ну или вообще через std::string, как и для содержимого.
Ксю92
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 15:56  [ТС]     Удалить из каждой строки файла первые K символов #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().
Можете набросать пример для моего случая?
Просто у меня беда как раз с чтением и записью в файлы(((
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
06.06.2012, 15:56     Удалить из каждой строки файла первые K символов #6
Немного не так. Функция getline нужна не от потока, а отдельная. И проверка условия конца файла в заголовке цикла while практически всегда работает неправильно.
Цикл может выглядеть так:
C++
1
2
    while (getline(file1, buffer))
      file2 << buffer.erase(0, k) << std::endl;
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.06.2012, 16:02     Удалить из каждой строки файла первые K символов #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 16:11     Удалить из каждой строки файла первые K символов
Еще ссылки по теме:

Удалить из i-ой строки файла i первых символов C++
C++ Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2
Удалить первые 16 строк текстового файла C++

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

Или воспользуйтесь поиском по форуму:
Ксю92
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
06.06.2012, 16:11  [ТС]     Удалить из каждой строки файла первые K символов #8
Спасибки Вам огромные!! Все получилось!
Yandex
Объявления
06.06.2012, 16:11     Удалить из каждой строки файла первые K символов
Ответ Создать тему
Опции темы

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru