Shell. Чтение текстового файла по строкам.

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
Delphin911
Сообщения: 8
Зарегистрирован: 07 апр 2005, 09:36
Откуда: Москва
Контактная информация:

07 апр 2005, 09:42

Подскажите как можно прочитать текстовый файл по строкам и в зависимости от значения строки, делать с ней разные вещи. Ну например, кидать в другой файл, присваивать значение строки переменной ит.д.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

07 апр 2005, 11:24

Всё делается очень просто: либо с помощью функции fgets, которая позволяет читать файл построчно, либо с помощью С++ стримов. Возникает, правда, один вопрос. При чём здесь Shell?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Delphin911
Сообщения: 8
Зарегистрирован: 07 апр 2005, 09:36
Откуда: Москва
Контактная информация:

07 апр 2005, 11:38

Как при чем? :shock:
Скрипт на shell, точнее даже на bash
Delphin911
Сообщения: 8
Зарегистрирован: 07 апр 2005, 09:36
Откуда: Москва
Контактная информация:

07 апр 2005, 11:42

И еще, прошу прощения, но я новичек в программировании на shell и никак не могу понять синтаксис этого fgets. Нельзя ли конкретный примерчик. Скажем нужно мне переменной x присвоить значение 20 строки файла test.txt
Alexie D.
Сообщения: 13
Зарегистрирован: 01 апр 2005, 12:12

08 апр 2005, 05:36

Delphin911 ну я так понимаю что fgets считывает файл по строчно....

char *fgets( char *string, int n, FILE *stream );
char *string - переменная куда читать строку из файла
int n - количество символов которые нужно считать из строки
FILE *stream - ну а тут имя файла, и аттрибуты на открытие

//обьявляем переменные....
//для файла
FILE *stream;
//куда читать строку из файла
char line[100],line2[100];
// если файл открыли то начинаем читать из него данные
if( (stream = fopen( "C:\\test.txt", "r" )) != NULL )
{
fgets(line, 1000, stream );
//считали первую строку
fgets(line2, 1000, stream );
//считали вторую строку и т.д.
MessageBox(0, LPSTR(line), "Строка - 1", MB_OK);
//ну а тут можно вывести строку......
MessageBox(0, LPSTR(line2), "Строка - 2", MB_OK);
fclose( stream );
}

Вообще я это взял МСДНа там поэтому поводу очень подробно..... удачи!
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

08 апр 2005, 13:06

Скрипт на shell, точнее даже на bash
взял МСДНа
Парни, сдаётся мне вы о разных ОСях толкуете. Судя по всему, сей топик заблудился.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

08 апр 2005, 13:31

И у меня такое же ощущение :) Сразу после того, как Delphin911 ответил на вопрос о shell.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Delphin911
Сообщения: 8
Зарегистрирован: 07 апр 2005, 09:36
Откуда: Москва
Контактная информация:

12 апр 2005, 11:39

Вот так я при помощи друзей решил проблему с чтением файла по строкам и сравнения строки с определенным значением

#!/usr/bin/bash

set -vx

cat /remote/ad/test | while read b
do
x=${b#*: }
if [[ `echo $b | grep dn:` ]]
then
echo $c
c=$x
else
c=$x+$c (здесь пробовал по-разному c=$x$c, c="$x""$c" и т.д.)
fi
done

Но бяда теперь вот в чем. Скажем имеем три строки

1 строка - dn: 1111
2 строка - m: 22222222
3 строка - g: 333333333333

и вот в результате, вместо 333333333333222222221111 получаем вот что 111122223333

Подмогните плиз!
Ответить