LINUX.ORG.RU

[stream][c++]Ввод из файла

 ,


0

0

Хочу ввести данные из файла следующего вида:

10    xNum_x[br]
1     yNum_y[br]
10    zNum_z[br]
...

Как правильно это реализовать с поомощью потоков. Просмотрел кучу примеров, так и не понял как это делать. x_Num - коментарий в файле, для программы он не нужен.

★★★★★

Или хотя-бы нормальный howto подскажите.

Zodd ★★★★★
() автор топика

Обработать входной файл фильтром на основе grep/awk, после чего читать столбец цифр.

Unixway очень правильная концепция. Зачем городить чреватые проблемами костыли для чтения сложного формата, когда проще читать по-простому, но предварительно обработать входной файл утилитами, специально преднязначенными для обработки текста?

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Мне нужен файл с начальными данными, а комментарии чтобы не спутать который из них какой параметр.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Ну так преобразуйте исходный файл в такой, формат которого будет проще для парсинга. Преобразование можно выполнить тем же grep'ом и т.п.

bk_ ★★
()

Все просто. Читаешь, проверяешь в потоке badbit, если нужно - сбрасываешь и читаешь дальше. Если какая-нибудь операция ввода завершилась неудачно в потоке устанавливается badbit и пока он не будет сброшен все операции чтения ничего не делают. На счет комментариев - http://www.cppreference.com/wiki/io/ignore . Вообще почитай что-нибудь про потоки.

anonymous
()
Ответ на: комментарий от bk_

Вот сделал.

xNum:10
yNum:1                       
zNum:10
q:0.25
L_x:10.0
C_y:0.2 
Как работать с grep'ом (не в консоли) не представляю - в никсах опыт программирования нулевой.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

>Как работать с grep'ом (не в консоли) не представляю

да вобщем как и в винде - обычный запуск внешнего приложения :)

annulen ★★★★★
()
Ответ на: комментарий от annulen

а я правильно понимаю, что в коментарии нет пробелов?

Да. Хотя это не принципиально. Еще вариант форматирование файла:

10  #xNum 
1   #yNum                        
10  #zNum

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

нет, это принципиально. Потому что в этом случае задача явно не стоит треда ))

ifstream fin; int i=0; while(!fin.eof()) { fin >> x[i] >> comment[i]; i++; }

annulen ★★★★★
()
Ответ на: комментарий от Zodd

cat your_human_readable_input | grep -Ei -o '^[^#]+' | ./your_program

в самой программе просто читать числа типа int

annoynimous ★★★★★
()
Ответ на: комментарий от winlogon

только настоящий [[любитель | упоротый]] С++ будет парсить файл регекпами, когда его можно прочитать циклом из двух строк

annulen ★★★★★
()
Ответ на: комментарий от annoynimous

Понимаю, что так не Ъ. Но как-то не очень этот вариант

cat your_human_readable_input | grep -Ei -o '^[^#]+' | ./your_program

Zodd ★★★★★
() автор топика
Ответ на: комментарий от annulen

> только настоящий [[любитель | упоротый]] С++ будет парсить файл регекпами

Парсить регекспами будет упоротый перлом, а не плюсами ;)

const86 ★★★★★
()
Ответ на: комментарий от Zodd

Если ты сейчас не понимаешь, почему так не правильно, просто так не делай. Ибо когда поймешь — будет поздно. Если цель твоей программы не чтение/обработка текстов, то не следует пытаться научить ее еще и этому. Пусть она делает свою маленькую работу хорошо. Гораздо правильнее «подсунуть» ей числа в нужном формате, подготовив их другой программой (скриптом). Представь, что завтра ты изменишь представление, и придется твою программу переделывать. А если она еще и нетривиальную обработку данных совершает, то понять где возникла проблема — в коде считывания или коде обработки — может быть подчас трудно.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

вы всегда придумываете километровые скрипты, прежде чем прочитать данные в два столбца? да, из кучи говна вытянуть данные скриптом горзадо проще, чем плюсами, но это явно не тот случай

annulen ★★★★★
()
Ответ на: комментарий от annoynimous

>понять где возникла проблема — в коде считывания или коде обработки — может быть подчас трудно.

++, разделять нужно всегда четко, но не обязательно писать обработку и чтение на разных «языках»

annulen ★★★★★
()
Ответ на: комментарий от annulen

вытянуть данные скриптом горзадо проще, чем плюсами, но это явно не тот случай

Да, тут количество данных не так часто меняется. Смысла слишком усложнять не вижу.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

>Смысла слишком усложнять не вижу.

Я тоже. Кажется, в этом треде собрались любители поизвращаться. Коммент - это ведь просто название переменной? тогда пробелов там появиться не должно. Но если пробел может (случайно) образоваться, будет опа, и придется читать построчно

annulen ★★★★★
()
Ответ на: комментарий от annulen

> Но если пробел может (случайно) образоваться, будет опа, и придется читать постро

Вот, уже пошли костыли. Через пару месяцев программинга проект перестанет быть управляемым.

annoynimous ★★★★★
()
Ответ на: комментарий от Eddy_Em

самое разумное решение из предложенных

lester ★★★★
()

while( !file.eof() ){
    std::getline( config, String ) 
    std::string::size_type commentPos = String.find('#');
    // удаляем комментарии
    if( commentPos != std::string::npos )
    	 String = String.substr( 0, commentPos );
    // удаляем лишние пробелы
    std::string::size_type emptyPos = String.find_last_not_of(' ');
    if( emptyPos != std::string::npos )
        String = String.substr( 0, emptyPos + 1);

а потом с остатком что угодно делаем.

ozo
()
Ответ на: комментарий от Eddy_Em

Ну типа более универсально, а вдруг там не будет числа или вся строка коммент/пустая, наверняка ошибку какую получим.

ozo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.