Ввести строки из файла записать их в стек вывести строки в файл в обратном порядке

Обновлено: 07.07.2024

Примеры работы с текстовыми файлами. Модификация файлов. Сортировка данных в файлах. Конвертирование данных файла в массив

В данной теме наводятся примеры решения известных задач, возникающих при обработке текстовых файлов на языке C++. Проработав решения этих задач, вы научитесь обрабатывать массивы строчных данных, управлять распределением памяти а также использовать средства C++ для работы с текстовыми файлами.

Содержание

  • 2. Функция CountLinesInFile() . Подсчет количества строк в текстовом файле
  • 3. Функция GetStringsFromFileC() . Получить массив (список) строк типа char* из текстового файла
  • 4. Функция GetStringsFromFileS() . Получить массив строк типа string из текстового файла
  • 5. Функция SetStringsToFileS() . Записать массив (список) строк типа string в текстовый файл
  • 6. Функция ChangeStringInFileC() . Замена строки в текстовом файле
  • 7. Функция RemoveStringFromFileByIndex() . Удаление строки из файла по его номеру
  • 8. Функция InsertStringToFile() . Вставка строки в заданную позицию в файле
  • 9. Функция SwapStringsInFile() . Обмен местами двух строк в файле
  • 10. Функция ReverseStringsInFile() . Реверсирования строк файла (перестановка строк файла в обратном порядке)
  • 11. Функция SortStringsInFile() . Сортировка строк в файле
  • Связанные темы

Поиск на других ресурсах:

1. Как определить, что данные в текстовом файле закончились?

Для определения конца файла используется функция eof() . Функция возвращает результат типа bool . Прототип функции следующий

здесь std – пространство имен, в котором объявлена функция eof() .

Если при вызове функции текущий указатель чтения указывает на конец файла, то функция возвращает true . В противном случае функция возвращает false .

Пример 1.

Ниже приведен фрагмент кода, в котором используется функция eof() для определения, достигнут ли конец файла, которому соответствует экземпляр с именем inputFile

Пример 2.

Чаще всего функция eof() используется в цикле while при чтении строк файла

Как только будет достигнут конец файла inputFile , то произойдет выход из цикла.

2. Функция CountLinesInFile() . Подсчет количества строк в текстовом файле

Функция CountLinesInFile() возвращает количество строк в текстовом файле.

Использование функции GetStringsFromFileC() может быть, например, следующим:

4. Функция GetStringsFromFileS() . Получить массив строк типа string из текстового файла

Работа с типом string более удобна чем с типом char *. В следующем фрагменте кода реализована функция GetStringsFromFileS() , читающая строки из текстового файла и записывающая их в массив (список) типа string . Данная функция использует функцию CountLinesInFile() , которая описывается в пункте 2 данной темы.

Использование функции GetStringsFromFileS() может быть, например, следующим

Результат работы программы (содержимое файла TextFile1.txt ):

5. Функция SetStringsToFileS() . Записать массив (список) строк типа string в текстовый файл

При работе с текстовыми файлами полезна функция SaveStringsToFileS() , которая записывает массив строк в файл. В нижеследующих примерах эта функция будет использоваться для записи модифициованного списка в файл.

Ниже приведен пример использования функции SetStringsToFileS() .

6. Функция ChangeStringInFileC() . Замена строки в текстовом файле

В примере приведена функция, заменяющая строку в файле в заданной позиции. Данная функция использует следующие функции:

Данная функция не использует дополнительный файл для копирования. Функция получает строки файла в виде списка lines, которые служат копией файла. Затем происходит запись этих строк в этот же файл за исключением строки, которую нужно заменить в файле. В позиции замены записывается входная строка замены. Таким образом происходит замена строки в текстовом файле.

Использование данной функции може быть, например, следующим:

По желанию, можно изменить ввод входных данных (имя файла, позиция, строка замены).

7. Функция RemoveStringFromFileByIndex() . Удаление строки из файла по его номеру

Удаление строки из файла по его номеру можно выполнять по примеру п. 6 (замена строки в текстовом файле).
Общий алгоритм следующий:

  • прочитать все строки файла в массив (список);
  • удалить строку из массива;
  • записать модифицированный массив обратно в файл.

Для формирования списка строк можно использовать функции GetStringsFromFileC() и GetStringsFromFileS() , которые описаны в пунктах 3 и 4.

Текст функции удаления строки по его номеру следующий.

Использование функции может быть, например, следующим

8. Функция InsertStringToFile() . Вставка строки в заданную позицию в файле

Подход такой же, как в предыдущих пунктах. Нужно получить строки файла в виде массива (тип string или char *). Затем нужно вставить строку в массив и записать измененный массив строк обратно в файл.
Если значение позиции вставки равно количеству элементов в файле, то строка добавляется в конец файла.

Вызов функции InsertStringToFile() в функции main() может быть следующим.

9. Функция SwapStringsInFile() . Обмен местами двух строк в файле

Сокращенный алгоритм функции SwapStringsInFile() следующий:

  1. Прочитать строки файла в список.
  2. Поменять строки в списке.
  3. Записать измененный список обратно в файл.

Текст функции обмена строк следующий.

Вызов функции SwapStringsInFile() из функции main() может быть следующим

10. Функция ReverseStringsInFile() . Реверсирования строк файла (перестановка строк файла в обратном порядке)

Алгоритм метода следующий:

  • считать строки из файла и записать их в массив;
  • обменять местами элементы массива так, чтобы строки массива размещались в обратном порядке;
  • записать измененный массив снова в файл

Текст функции ReverseStringsInFile() следующий

Использование ReverseStringsInFile () может быть, например, следующим

11. Функция SortStringsInFile() . Сортировка строк в файле

В примере демонстрируется сортировка строк файла с помощью метода вставки. Предварительно строки копируются в массив и там сортируются. Затем, отсортированный массив строк обратно записывается в файл.

Получив строку, переверните ее, используя стек. Например, «GeeksQuiz» следует преобразовать в «ziuQskeeG».

Ниже приведен простой алгоритм для обращения строки с использованием стека.

Следующие программы реализуют вышеуказанный алгоритм.

using namespace std;


// Структура для представления стека


// функция для создания стека заданного
// вместимость. Инициализирует размер стека как 0
Stack* createStack(unsigned capacity)

Stack* stack = new Stack();

stack->array = new char [(stack->capacity * sizeof ( char ))];


// стек заполнен, когда вершина равна последнему индексу

int isFull(Stack* stack)


// Стек пуст, когда вершина равна -1

int isEmpty(Stack* stack)


// Функция для добавления элемента в стек.
// увеличивает вершину на 1

void push(Stack* stack, char item)


// Функция для удаления элемента из стека.
// Уменьшается вершина на 1

char pop(Stack* stack)


// стековая функция для обращения строки

void reverse( char str[])

// Создать стек емкости

// равно длине строки

int n = strlen (str);

Stack* stack = createStack(n);

// Поместить все символы строки в стек

for (i = 0; i < n; i++)

// Высовываем все символы строки и

// положить их обратно на ул

for (i = 0; i < n; i++)

char str[] = "GeeksQuiz" ;

cout << "Reversed string is " << str;


// Этот код предоставлен rathbhupendra


// Структура для представления стека


// функция для создания стека заданного
// вместимость. Инициализирует размер стека как 0

struct Stack* createStack(unsigned capacity)

struct Stack* stack = ( struct Stack*) malloc ( sizeof ( struct Stack));

stack->array = ( char *) malloc (stack->capacity * sizeof ( char ));


// стек заполнен, когда вершина равна последнему индексу

int isFull( struct Stack* stack)


// Стек пуст, когда вершина равна -1

int isEmpty( struct Stack* stack)


// Функция для добавления элемента в стек.
// увеличивает вершину на 1

void push( struct Stack* stack, char item)


// Функция для удаления элемента из стека.
// Уменьшается вершина на 1

char pop( struct Stack* stack)


// стековая функция для обращения строки

void reverse( char str[])

// Создать стек емкости

// равно длине строки

int n = strlen (str);

struct Stack* stack = createStack(n);

// Поместить все символы строки в стек

for (i = 0; i < n; i++)

// Высовываем все символы строки и

// положить их обратно на ул

for (i = 0; i < n; i++)


// Программа драйвера для проверки вышеуказанных функций

char str[] = "GeeksQuiz" ;

printf ( "Reversed string is %s" , str);

/ * Java программа для реверса
Строка с использованием стека * /

// функция для проверки, если стек пуст

a = new char [size];

// функция для вставки элемента в стек

boolean push( char x)

System.out.println( "Stack Overflow" );

// функция для извлечения элемента из стека

System.out.println( "Stack Underflow" );

// функция для обращения строки

public static void reverse(StringBuffer str)

// Создать стек емкости

// равно длине строки

int n = str.length();

Stack obj = new Stack(n);

// Нажмите все символы строки

for (i = 0 ; i < n; i++)

// Высовываем все символы строки

// и вернуть их обратно в str

for (i = 0 ; i < n; i++)

char ch = obj.pop();

public static void main(String args[])

// создаем новую строку

StringBuffer s= new StringBuffer( "GeeksQuiz" );

// вызов метода обратного

// выводим обратную строку

System.out.println( "Reversed string is " + s);

return len (stack)

if size(stack) = = 0 :

if isEmpty(stack): return

for i in range ( 0 ,n, 1 ):

for i in range ( 0 ,n, 1 ):

print ( "Reversed string is " + string)

public int size;

// функция для проверки, если стек пуст

public Boolean isEmpty()

public Stack( int n)

a = new char [size];

// функция для вставки элемента в стек

public Boolean push( char x)

Console.WriteLine( "Stack Overflow" );

// функция для извлечения элемента из стека

public char pop()

Console.WriteLine( "Stack Underflow" );

// функция для обращения строки

public static void reverse(StringBuilder str)

// Создать стек емкости

// равно длине строки

int n = str.Length;

Stack obj = new Stack(n);

// Нажмите все символы строки

for (i = 0; i < n; i++)

// Высовываем все символы строки

// и вернуть их обратно в str

for (i = 0; i < n; i++)

char ch = obj.pop();

public static void Main(String []args)

// создаем новую строку

StringBuilder s = new StringBuilder( "GeeksQuiz" );

// вызов метода обратного

// выводим обратную строку

Console.WriteLine( "Reversed string is " + s);


// Этот код предоставлен Rajput-Ji

using namespace std;


// Утилита для замены двух символов

void swap( char *a, char *b)


// стековая функция для обращения строки

void reverse( char str[])

// получаем размер строки

int n = strlen (str), i;

for (i = 0; i < n/2; i++)


// Программа драйвера для проверки вышеуказанных функций

cout<< "Reversed string is " << str;


// Это код, предоставленный rathbhupendra


// Утилита для замены двух символов

void swap( char *a, char *b)


// стековая функция для обращения строки

void reverse( char str[])

// получаем размер строки

int n = strlen (str), i;

for (i = 0; i < n/2; i++)


// Программа драйвера для проверки вышеуказанных функций

printf ( "Reversed string is %s" , str);

// Java программа для обращения строки без использования стека

public class GFG

// Утилита для замены двух символов

static void swap( char a[], int index1, int index2)

char temp = a[index1];


// стековая функция для обращения строки

static void reverse( char str[])

// получаем размер строки

int n = str.length, i;

for (i = 0 ; i < n / 2 ; i++)

swap(str, i, n - i - 1 );


// Программа драйвера для проверки вышеуказанных функций

public static void main(String[] args)

char str[] = "abc" .toCharArray();

System.out.printf( "Reversed string is " + String.valueOf(str));

>
// Этот код предоставлен 29AjayKumar

string = string[:: - 1 ]

print ( "Reversed string is " + string)

public class GFG

// Утилита для замены двух символов

static void swap( char []a, int index1, int index2)

char temp = a[index1];


// стековая функция для обращения строки

static void reverse( char []str)

// получаем размер строки

int n = str.Length, i;

for (i = 0; i < n / 2; i++)

swap(str, i, n - i - 1);


// Программа драйвера для проверки вышеуказанных функций

public static void Main()

char []str = "abc" .ToCharArray();

Console.WriteLine( "Reversed string is " + String.Join( "" ,str));

>
// Этот код предоставлен PrinciRaj1992

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

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

Поэтому я хотел бы написать эти же строки в текстовом документе b, но только вот так:

Пока что у меня есть:

но это только возвращает:

в одну линию. любая помощь будет оценена по достоинству.

4 ответа

У меня есть вектор vec (256, 0), который я использую для записи типа символов и их частоты из входного файла. Таким образом, учитывая 3 а, мой vec[65] будет иметь значение 3. Я пытаюсь записать в выходной файл общее количество непустых символов, за которыми следует их символ ascii и частота.

Я хочу написать какой-то парсер файлов с использованием python. Он должен прочитать файл line-by-line, чтобы при необходимости заменить его, а затем записать строку new в выходной файл. Он должен быть вызван из командной строки (чтобы быть частью моего процесса сборки C). То, что у меня уже есть.

Одной строчки будет достаточно:

Вам просто нужно + '\n' , так как .write не делает этого для вас, в качестве альтернативы вы можете использовать

эквивалентно в Python 3:

что добавит вам новую строку. Или сделать что-то вроде этого:

Этот код предполагает, что вы не знаете, есть ли в последней строке новая строка или нет, если вы знаете, что она есть, вы можете просто использовать

Почему вы rstrip() свою строку, прежде чем написать ее? Вы удаляете новую строку в конце каждой строки, когда пишете ее. И все же затем вы замечаете, что у вас нет никаких новых строк. Просто удалите rstrip() в вашей записи.

Меньше значит больше.

Если бы я не мог доказать/проверить, что в последней строке есть завершающая новая строка, я лично был бы склонен связываться с одной строкой, где это имело значение, спереди. E.g.

или, если вы хотите записать его в другой поток:

Похожие вопросы:

Как прочитать файл в обратном порядке с помощью python? Я хочу прочитать файл от последней строки до первой строки.

Я пробовал искать, но не нашел именно того, что мне нужно. Я использую python 3, и мне нужна помощь в написании текстового файла в обратном порядке в другой выходной файл. Так что это будет входной.

Предположим, у меня есть следующий текстовый файл с разделителями (delimiter = space). Каждая строка содержит два целых числа, разделенных пробелом. Пример входного файла 1 2 1 3 2 1 Я хочу.

У меня есть вектор vec (256, 0), который я использую для записи типа символов и их частоты из входного файла. Таким образом, учитывая 3 а, мой vec[65] будет иметь значение 3. Я пытаюсь записать в.

Я хочу написать какой-то парсер файлов с использованием python. Он должен прочитать файл line-by-line, чтобы при необходимости заменить его, а затем записать строку new в выходной файл. Он должен.

Я делаю упражнение из книги и не могу понять этого; это не домашнее задание, я пытаюсь научить себя, и я пробовал все, что мог придумать, чтобы это сработало! Мне нужно прочитать строки из.

Я хотел бы добавить в свой пакетный скрипт команду для сортировки файлов в каталоге с номерами в имени файла в порядке возрастания. Затем я хочу записать их все в текстовый файл. На данный момент.

Могу ли я прочитать массив из входного буфера непосредственно в обратном порядке, не сохраняя его в переменной (в C++)? Это будет полезно, когда мы не хотим хранить весь массив только для того.

Я пытаюсь прочитать файл CSV в обратном порядке. Я могу сделать это, загрузив строки файла CSV в срез и перевернув срез, но это неправильный подход для больших размеров файлов. CSV reader возвращает.

Между вопросом о котенке и появлением этого вопроса в U & L о какой-то sed магии, как насчет реализации tac ?

Реализуйте программу, которая перевернет и напечатает строки в файле.

Файл, предоставленный как имя или через стандартный ввод

Линии, перевернутые, чтобы выровнять.

Байты исходного кода.

tac немного странно, когда речь заходит о переводе строки. Он преобразуется a\nb\n (завершающий перевод строки) в b\na\n и a\nb (без завершающего перевода строки) в ba\n . Это то, как наш код должен себя вести? Кроме того, если нам нужно повторить поведение tac, то 3-байтовые ответы Bash, которые выполняются, tac являются лишь вопросом времени . @ Денис на данный момент, вероятно, лучше оставить неопределенным. @ Денис имеет смысл для меня. Визуализируйте строки файла как горизонтальные строки, все заканчивающиеся на \n . tac меняет порядок этих строк Если an \n удален из середины файла, строка, которую он завершил, присоединяется к следующей строке, но в случае последней строки следующей строки нет, к которой можно присоединиться.

GS2, 3 байта

Три байта - это по порядку разделенные линии, обратные и соединительные строки.

Ведет себя точно так же, как tac . Для этого кода требуется -p переключатель, который я посчитал 1 байтом.

Тестовые прогоны

Как это работает

Как объясняется здесь , -p переключатель в основном while (<>) < . ; print >охватывает программу, поэтому исходный код эквивалентен

Для каждой строки ввода мы добавляем текущую строку ( $_ ) к $\ (изначально неопределенному), обновляя последнюю с результатом.

После обработки всех строк print печатается значение локальной переменной $_ (не определено в этой области), за которым следует разделитель выходных записей ( $\ ).

@ xebtl Evilly. Добавление -p переключателя оборачивает ваш код в цикл, который начинается while(<>) < и заканчивается >continue < print >, что позволяет фильтровать входные данные просто путем изменения $_ . $\=$_.$\ добавляет каждую строку ввода к разделителю выходной записи, и преждевременно > < завершает поставляемый perl while блок, поэтому continue блок больше не присоединяется к нему. Таким образом, все строки ввода добавляются $\ в обратном порядке, а затем, в конце continue < print >концов, запускается, печатая «ничто» ( $_ будет не определено после конца ввода), но с разделителем $\ . @xebtl grr, форматирование кода в комментариях кажется немного нарушенным, когда обратные косые черты и обратные косые черты приближаются друг к другу. Возможно, вы можете догадаться о том, что я пытался сказать. @primo Первый пример показывает, что происходит в этом случае. Вывод будет странным, но в точности как у ТАСа.

.z является вводом, разделенным строками в виде списка, _ переворачивает его и j соединяет его символом, который по умолчанию является \n .

Режим ) enable --in-out-line-array , а остальная часть программы - " реверсирование массива строк.

Retina работает в режиме Match с одним регулярным выражением. Обычно это просто печатает количество совпадений, но при этом ! мы настраиваем его для печати реальных совпадений (разделенных переводом строки).

Фактическое регулярное выражение просто .*$ . .* соответствует любой строке (потенциально пустой), потому что . может соответствовать любому символу, кроме перевода строки. Я вернусь $ через минуту.

И, наконец, m делает $ матч конец строки , а не в конце строки. Зачем нам это вообще нужно? Беда в том, что .* генерирует посторонние совпадения. Рассмотрим подстановку регулярных выражений

применяется к входу baaababaa . Вы могли бы подумать, что это даст baaaxbaxbaax , но на самом деле это дает вам baaaxxbaxxbaaxx . Зачем? Потому что после сопоставления aaa курсор двигателя находится между a и b . Теперь он не может больше соответствовать a s, но a* также удовлетворен пустой строкой. Это означает, что после каждого совпадения вы получаете еще одно пустое совпадение.

Мы не хотим этого здесь, потому что это введет дополнительные пустые строки, поэтому мы отбрасываем эти посторонние совпадения (которые находятся в начале строк, из-за режима справа налево), требуя, чтобы совпадения включали конец линия.

Читайте также: