Автор Тема: C++ или "флудить, так флудить")  (Прочитано 11147 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dajver

  • Постоялец
  • ***
  • Сообщений: 105
    • Просмотр профиля
C++ или "флудить, так флудить")
« : 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, но было это лет несколько назад. После этого серьёзными языками не занимался.

Оффлайн nog

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #1 : 23 Июля 2012, 23:36:18 »
Добавь:
#include <stdio.h>

Вместо _getch(); используй getchar();

FearOfTheLight

  • Гость
Re: C++ или "флудить, так флудить")
« Ответ #2 : 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).

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

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #3 : 25 Июля 2012, 20:08:27 »
Можно еще попробовать компилировать g++ а не gcc.

Оффлайн Dajver

  • Постоялец
  • ***
  • Сообщений: 105
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #4 : 25 Июля 2012, 22:42:27 »
вопрос остаётся открытым - компилятор не хочет работать с этой простой программой..." нет декларации «_getch» в этой области видимости" и всё тут... Что есть вообще эти включаемые файлы?
«_getch», как я понимаю, ждёт пока будет нажата any-key... Или я не прав?..

Оффлайн nog

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #5 : 25 Июля 2012, 23:16:11 »
Хм, повторю еще раз:

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

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

Желательно скачать и почитать какую-нибудь книжку по синтаксису. Например классику, Страустрап "Язык C++". Джефа Элджера неплохие книжки. Можно почитать Джонсон, Троан "Разработка приложений в Linux". Шилдт неплохо пишет, хотя больше для виндоуса, но разницы в программировании особой нет.
FearOfTheLight

Оффлайн Dajver

  • Постоялец
  • ***
  • Сообщений: 105
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #6 : 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

и так далее.

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

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

Может немного сумбурно, но как-то так... Заранее всем спасибо)

Оффлайн Andys

  • Ветеран
  • *****
  • Сообщений: 1220
  • Maidophile
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #7 : 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], или ещё больше. Прочитал - обрабатываешь проверками посимвольно, конец строки там, или нет.
« Последнее редактирование: 13 Августа 2012, 23:55:18 от Andys »

Оффлайн nog

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #8 : 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 не десяток гиг. Но человек всёже не демона БД пишет.

Вот вопрос с изменениями гораздо серьезнее. Если одновременно могут изменять данные несколько клиентов, тут сначала нужно реализовать блокировку файлов.
[свернуть]

Оффлайн New man

  • Ветеран
  • *****
  • Сообщений: 600
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #9 : 25 Августа 2012, 21:44:23 »
Может быть человек имел ввиду знак EOLN?
вроде символы #10#13

Оффлайн iKlim

  • Старожил
  • ****
  • Сообщений: 391
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #10 : 27 Августа 2012, 15:26:08 »
Сиплюсисты подскажите, как заставить Cataclysm русский текст отображать на Windows? И так его компилировал, и эдак, ничего не отображает.

Оффлайн Jesus

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1459
  • Баню, удаляю исключительно рекламо-спамеров.
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #11 : 27 Августа 2012, 15:33:26 »
Сиплюсисты подскажите, как заставить Cataclysm русский текст отображать на Windows? И так его компилировал, и эдак, ничего не отображает.
для начала шрифт использовать с поддержкой русского. по умолчанию шрифт вроде русский не держит. а далее :) надо разбираться я что-то пока не пробовал русские буквы туда пихать.
(шрифт там в каком-то файле меняется)

Оффлайн iKlim

  • Старожил
  • ****
  • Сообщений: 391
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #12 : 27 Августа 2012, 16:49:09 »
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.

Оффлайн Jesus

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1459
  • Баню, удаляю исключительно рекламо-спамеров.
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #13 : 27 Августа 2012, 18:36:27 »
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.
там совершенно по разному выводится инфа в никсовой и в виндовой версии.

Оффлайн Jesus

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1459
  • Баню, удаляю исключительно рекламо-спамеров.
    • Просмотр профиля
Re: C++ или "флудить, так флудить")
« Ответ #14 : 27 Августа 2012, 20:28:19 »
И шрифт я пихал нормальный, и в исходниках указывал поддержку русского, и фигушки там. Судя по всему, только для линукса сей эксперимент работает удачно, exe-файл для Windows не выходит русифицированным. Можно хоть в меню одно слово для теста поменять, хоть MOTD в отдельной папке. Я не программист и найденной в интернете информации оказалось недостаточно, чтобы одолеть зверя.
Нахрапом не получилось разобраться, а серьезно разбираться лениво.