Форум Dwarf Fortress

Разное => Оффтопик => Софт и кодинг => Тема начата: Dajver от 23 Июля 2012, 23:01:10

Название: C++ или "флудить, так флудить")
Отправлено: Dajver от 23 Июля 2012, 23:01:10
Как было сказано рядом - многие у нас программят)
Посему прошу подсказать вменяемых книжек и сайтов для обучения с нуля С++.
Писать собираюсь на gedit, компилить консолью, посему всякого GUI'на просьба не предлагать... Никого не хочу обидеть, слушать про GUI не буду - считайте это мой личный челлендж)

По сути вопроса - пишу "Hello. world!". Записал, сохранил в формат .cpp, в консоли gcc имя_файла.cpp...а потом ругается.
Мой код:
#include <iostream>
#include <conio.h>

using namespace std;

int main ()
{
  cout << "Hello world!!!\n";
  _getch();
  return 0;
}

Ругался сначала на conio.h - вычитал в интернетах, что в Линуксе подобного зверя нет вообще. Пробовал менять на curses.h и ncurses.h - прокатывает, но выдают ошибку " нет декларации «_getch» в этой области видимости".

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

P.S. в школе учил Basic, но было это лет несколько назад. После этого серьёзными языками не занимался.
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 23 Июля 2012, 23:36:18
Добавь:
#include <stdio.h>

Вместо _getch(); используй getchar();
Название: Re: C++ или "флудить, так флудить")
Отправлено: FearOfTheLight от 24 Июля 2012, 03:33:56
Цитировать
посему всякого GUI'на просьба не предлагать...
может IDE?

если собираешься кодить долго и счастливо: vim в помощь. там GUI вообще нет. только тёплая и уютная консоль (т.е. можно этим пользоваться не поднимая иксы) могу поделится cheat sheet'ом.

для тренировки: http://projecteuler.net

для чтения: http://shop.oreilly.com/product/9780596007614.do
http://greenteapress.com/thinkcpp/index.html
и официальные доки(man).

пара таких книг помогут дать пинок в направлении. ну а дальше изучай структуры данных, алгоритмы (без них довольно трудно решить много упоротых проблем),ну а дальше видно будет
Название: Re: C++ или "флудить, так флудить")
Отправлено: insolor от 25 Июля 2012, 20:08:27
Можно еще попробовать компилировать g++ а не gcc.
Название: Re: C++ или "флудить, так флудить")
Отправлено: Dajver от 25 Июля 2012, 22:42:27
вопрос остаётся открытым - компилятор не хочет работать с этой простой программой..." нет декларации «_getch» в этой области видимости" и всё тут... Что есть вообще эти включаемые файлы?
«_getch», как я понимаю, ждёт пока будет нажата any-key... Или я не прав?..
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 25 Июля 2012, 23:16:11
Хм, повторю еще раз:

1. Вместо #include <conio.h> написать #include <stdio.h>
2. Вместо _getch(); getchar();
3. Скомпилировать.
4. Запустить.
5. Радоваться.

_getch() ага, ждет, но conio.h это досовская библиотека, нету её в линуксе.

Желательно скачать и почитать какую-нибудь книжку по синтаксису. Например классику, Страустрап "Язык C++". Джефа Элджера неплохие книжки. Можно почитать Джонсон, Троан "Разработка приложений в Linux". Шилдт неплохо пишет, хотя больше для виндоуса, но разницы в программировании особой нет.
Название: Re: C++ или "флудить, так флудить")
Отправлено: Dajver от 13 Августа 2012, 23:28:33
С компиляцией разобрался, активно учу и пишу) Дошёл до работы с файлами и тут возник один щекотливый момент.

Требуется из файла file.txt прочитать текст. Содержимое файла -

Текст1
Текст1 Текст1
Текст1 Текст1 Текст1 Текст1 Текст1 Текст1

Текст2
Текст2 Текст2
Текст2 Текст2 Текст2 Текст2 Текст2 Текст2

и так далее.

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

Вопрос - как именно этот маркер найти? Мне нужно в зависимости от первой строчки абзаца выводитьодин из абзацев. Скажем в файле список фруктов с описанием. Пользователь задаёт в строке значение "яблоко", в файле находится абзац, начинающийся с "яблоко", читается абзац и выводится на экран.

Может немного сумбурно, но как-то так... Заранее всем спасибо)
Название: Re: C++ или "флудить, так флудить")
Отправлено: Andys от 13 Августа 2012, 23:49:09
Требуется из файла file.txt прочитать текст. Содержимое файла ...
Если требуется именно алгоритм. С++ уже не помню, да и времени сейчас не будет конкретную прогу писать.
1. исхожу из того, что
а. нам кто-то дал этот текстовик.
б. текстовик меняется нечасто. как база данных - он есть, а несколько пользователей запрашивают то одно слово, то другое.

2. для облегчения будущих поисков его лучше проиндексировать. Сделать промежуточный файл, в котором будут адреса начал абзацев и ключевое слово. Можно его для простоты (я не считаю что это оптимально, чисто для начала) сделать в формате -
слово1
адрес1
слово2
адрес2
итп...
Заполняется по простому алгоритму -
а. открываешь file.txt в байтовом режиме
б. проверяешь какой конец строки у тебя - односимвольный (\n) или двухсимвольный (\r\n). Если формат оговорен в условии - то не проверяешь...
в. читаешь ключевое слово-строку. пишешь его в индекс-файл без символов конца строки. берешь адрес начала следующей строки (убей не помню как функция называлась, которая возвращаеь текущую позицию в файле), пишешь в тот же индексфайл.
г. читаешь файл пока не будет пустая строка (подряд два символа конца строки, или четыре в зависимости от пункта б).
и в цикле в-г создаешь индекс - чтобы в будущем не просматривать весь исходный файл.
В конце еснно - сохранить файл

И потом основная прога - открывает индекс-файл, читает его (для простоты - в двумерный массив).
Пользователь вводит слово поиска - прога просматривает массив, есть ли такое слово. Если есть - берет соответствующий адрес (который тоже прочитан из того индекса), открывает исходный file.txt, переводит курсор файла (функция fseek, что ли) на соотв. адрес, читает байты пока не найдет конец абзаца (как в предыдущем случае, два конца строки подряд).
Эти байты и будут нужным текстом. Само слово у нас есть из индекса, текст мы прочитали - выводим его и все.

Если исходный file.txt меняется часто (каждый раз), то индекс будет неэффективен, тут просто построчно ищем слово и потом выводим все до пустой строки.
Также для начала можно сделать именно этот простой вариант, просто чтобы попробовать сами функции ввода-вывода. Потом уже, в будущем, заморачиваться индексом итп

п.с. поскольку чтение в байтовом режиме - то делается через буферный массив, типа char[1024], или ещё больше. Прочитал - обрабатываешь проверками посимвольно, конец строки там, или нет.
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 14 Августа 2012, 00:26:57
Не то чтобы нужно, есть и другие варианты создания простейших таблиц данных  ;)

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

#Текст1
Текст1 Текст1
Текст1 Текст1 Текст1 Текст1 Текст1 Текст1

#Текст2
Текст2 Текст2
Текст2 Текст2 Текст2 Текст2 Текст2 Текст2

Читаешь первый символ каждой строки, нашел решетку, сравниваешь с ключем. Если совпало, выводишь всё до следующей решетки или конца файла. Если не совпало ищеш следующую.

Можно ключ заключать в квадратные скобки, как делают в ini файлах. Можешь посмотреть на формат xml, но там возможностей слишком много, он больше для хранения древовидных структур произвольных параметров.

Чуть посложнее, но быстрее, как правильно сказал Andys, будет прочитать весь файл в память как массив байт (не забудь выделить память), и потом работать с блоком памяти. Только если у тебя текст в уникоде, не забывай, что нелатинские символы занимают 2 байта.

Спойлер
Andys, предлагаешь человеку реализовать cобственный SQL сервер (точнее dbf)?  :)

При небольшом количестве записей и размере данных, индексный файл может замедлить обращение к данным. При большой нагрузке лучше индекс строить в памяти при загрузке программы и менять при изменениях. И сам файл можно просто прочитать в память, если конечно file.txt не десяток гиг. Но человек всёже не демона БД пишет.

Вот вопрос с изменениями гораздо серьезнее. Если одновременно могут изменять данные несколько клиентов, тут сначала нужно реализовать блокировку файлов.
[свернуть]
Название: Re: C++ или "флудить, так флудить")
Отправлено: New man от 25 Августа 2012, 21:44:23
Может быть человек имел ввиду знак EOLN?
вроде символы #10#13
Название: Re: C++ или "флудить, так флудить")
Отправлено: iKlim от 27 Августа 2012, 15:26:08
Сиплюсисты подскажите, как заставить Cataclysm (https://github.com/Whales/Cataclysm) русский текст отображать на Windows? И так его компилировал, и эдак, ничего не отображает.
Название: Re: C++ или "флудить, так флудить")
Отправлено: Jesus от 27 Августа 2012, 15:33:26
Сиплюсисты подскажите, как заставить Cataclysm (https://github.com/Whales/Cataclysm) русский текст отображать на Windows? И так его компилировал, и эдак, ничего не отображает.
для начала шрифт использовать с поддержкой русского. по умолчанию шрифт вроде русский не держит. а далее :) надо разбираться я что-то пока не пробовал русские буквы туда пихать.
(шрифт там в каком-то файле меняется)
Название: Re: C++ или "флудить, так флудить")
Отправлено: iKlim от 27 Августа 2012, 16:49:09
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.
Название: Re: C++ или "флудить, так флудить")
Отправлено: Jesus от 27 Августа 2012, 18:36:27
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.
там совершенно по разному выводится инфа в никсовой и в виндовой версии.
Название: Re: C++ или "флудить, так флудить")
Отправлено: Jesus от 27 Августа 2012, 20:28:19
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.
Нахрапом не получилось разобраться, а серьезно разбираться лениво.
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 27 Августа 2012, 22:37:58
Сиплюсисты подскажите, как заставить Cataclysm (https://github.com/Whales/Cataclysm) русский текст отображать на Windows? И так его компилировал, и эдак, ничего не отображает.
Глянул исходники. В виндоус версии вывода на экран, строка хранится как char *chars; Так-что никак два байта в один не впихнуть.
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 28 Августа 2012, 14:04:52
Можно, конечно извратиться и запихать текст в кодировке 1251 или 866, но, часть символов второй половины байта используется как служебные. В общем, получится такая фигня:
 (http://imglink.ru/thumbnails/28-08-12/a127eb1d40d35ca89d4a26e21fb5b213.jpg) (http://imglink.ru/show-image.php?id=9efaf0f5f350eb282fd9d4f5b6ad26f0)
Название: Re: C++ или "флудить, так флудить")
Отправлено: iKlim от 28 Августа 2012, 14:29:16
Глянул исходники. В виндоус версии вывода на экран, строка хранится как char *chars; Так-что никак два байта в один не впихнуть.
А переделать тип строки нельзя?
Название: Re: C++ или "флудить, так флудить")
Отправлено: nog от 28 Августа 2012, 18:10:59
Глянул исходники. В виндоус версии вывода на экран, строка хранится как char *chars; Так-что никак два байта в один не впихнуть.
А переделать тип строки нельзя?
Там придется не только тип строки, но и весь вывод переделывать. Лучше просить автора чтобы использовал pdcurses как на версии для мака. Или другой аналог ncurse.

Тут еще неизвестно, может ли вообще терминал виндоус работать в утф, если нет, то ничего не сделать.
Название: Re: C++ или "флудить, так флудить")
Отправлено: insolor от 11 Октября 2012, 16:04:19
Тут еще неизвестно, может ли вообще терминал виндоус работать в утф, если нет, то ничего не сделать.
Это не консоль, это обычное окно, притворяющееся консолью, как и в DF.
P.S. так что может и можно добавить нормальный вывод русского языка. Скорее всего нужно просто выводить псевдографику (карту) отдельно и текст различными способами, как это делается в DF при включенном ttf (к сожалению не везде(