1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
//Borland C++ 3.1 Работа с файлом Сохранение текстового файла // и чтение файла с выводом текста на экран #include <fstream.h> #include <iostream.h> #include <conio.h> int main() { clrscr(); const int MAXLEN_STR = 256; const char *PATH = "C:\\myfiles\\1.txt"; char *S; //Указатель на строку int count = 0; //Число строк /*============================================================================================*/ /*ПОДГОТОВКА*/ cout << "input string count: "; //Диалог: введите число строк. (cin >> count).ignore(); //вводим число //Создаём массив, на который сошлём указатель: S= new char[MAXLEN_STR]; /*КОНЕЦ ПОДГОТОВКИ*/ /*=============================================================================================*/ /*ЗАПИСЬ В ФАЙЛ ТЕКСТА*/ ofstream out(PATH); //Открываем файл для записи //Когда файл открыт для записи, пишем в него наши строки for (int i=0; i<count; i++){ cout << i+1 << ". "; cin.getline(S,MAXLEN_STR); //Запоминаем строку, введённую с клавиатуры out << S << endl; //Записываем строку и добавляем к записанной строке символ переноса строки } out.close(); //Сохраняем файл /*КОНЕЦ ЗАПИСИ В ФАЙЛ ТЕКСТА*/ /*=============================================================================================*/ cout << '\n'; /*=============================================================================================*/ char ch = 0; ifstream in(PATH); char S2[MAXLEN_STR]; //строка, в которую читаем while ( (ch = in.get()) != EOF){ //Объяснение ниже cout << ch; } in.close(); /*=============================================================================================*/ cin.get(); delete []S; //Чистим память } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//Borland C++ 3.1 Вывод текста из файла на экран //Использование заранее подготовленного массива строк #include <fstream.h> #include <iostream.h> #include <conio.h> int main() { clrscr(); const int MAXLEN_STR = 256; //Максимальная длина строки const int ROW_COUNT = 100; //Число строк не больше 100 const char *PATH = "C:\\myfiles\\1.txt"; //Путь к файлу char S[ROW_COUNT][MAXLEN_STR]; //Массив из 100 строк в 256 символов каждая int str_num = 0; //счётчик для массива строк, номер строки /*НАЧАЛО ЧТЕНИЯ ФАЙЛА*/ ifstream in(PATH); while (!in.eof()){ in.getline(S[str_num++], MAXLEN_STR); //запись прочитанной строки в массив строк } in.close(); /*КОНЕЦ ЧТЕНИЯ ФАЙЛА*/ /*ВЫВОД СОБРАННОГО МАССИВА НА ЭКРАН*/ for (int i=0; i<str_num; i++){ cout << S[i] << '\n'; } /*КОНЕЦ ВЫВОДА*/ cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//Borland C++ 3.1 Вывод текста из файла на экран Выделить памяти по количеству строк #include <fstream.h> #include <iostream.h> #include <conio.h> int main() { clrscr(); const int MAXLEN_STR = 256; //Максимальная длина строки const char *PATH = "C:\\myfiles\\1.txt"; //Путь к файлу char *S[MAXLEN_STR]; //Массив указателей на строки int count_n = 0; //счётчик переносов строк { /*ПОДСЧЁТ ПЕРЕНОСОВ СТРОК ВНУТРИ ФАЙЛА*/ char ch = 0; ifstream in(PATH); while ((ch = in.get()) != EOF){ if ('\n' == ch) count_n++; } in.close(); /*КОНЕЦ ПОДСЧЁТА*/ } int i = 0; //Переменная для счётчиков for (i=0; i<count_n+1; i++) S[i] = new char[MAXLEN_STR]; //Сколько переносов, столько строк int str_num = 0; //Номер строки ifstream in(PATH); while (!in.eof()){ //построчное чтение файла in.getline(S[str_num++],MAXLEN_STR); //запись считанной строки в массив } /*ВЫВОД СОБРАННОГО МАССИВА НА ЭКРАН*/ for (i=0; i<count_n+1; i++){ cout << S[i] << '\n'; } /*КОНЕЦ ВЫВОДА*/ for (i=0; i<count_n; i++) delete []S[i]; //Чистим память cin.get(); } |
В строке char *FName="C:\MyFile.txt"; лучше написать char *FName="C://MyFile.txt";
Например, в Dev C++ как в первом случае не компилирует.
const N=256; //Константный размер строки
Это ну очень просто урощает. Если мне надо в строку куда большее число элементов, скажем миллиона 2, что тогда делать?
а подскажите пожалуйста, как посимвольно выводить текст?
Добрый день! Вопрос появился: а как считывать построчно информацию из файла в разные переменные?
Тут по циклу считываем в один и тот же массив, а потом выводим. Хочется понять, как считать первую строчку из файла в один массив, вторую строчку — в другой массив и т.д… 😐
таки пример изложенный в статье это бинарное дерево или двусвязный список?
Все таки правильней будет
const char *FName="C:\\MyFile.txt"; //Путь к файлу
а так
char *FName="C:\MyFile.txt"; //Путь к файлу
кодеблок ругается.
таки пример изложенный в статье это бинарное дерево или двусвязный список?
а за что отвечает эта строчка:
system("CLS");
?
ато не совсем понял её здесь назначение
таки пример изложенный в статье это бинарное дерево или двусвязный список?
Объявлять
char *S = {""};
а потом сразу считывать туда строку символов — весьма плохая затея! Память-то под строку не выделена! И куда указывает S? Берём оч-ч-чень длинную строчку и получаем крах программы. Компилятор, кстати, в этом случае не ругается. Ему глубоко фиолетово, была ли выделена память для указателя. Он куда-то указывает, вот туда и будет записана строка, даже если в этом "куда-то" записаны нужные для дальнейшей работы программы данные.
Если уж объявили строку таким образом, то следует под неё выделить место:
char *s = {""};
s = new char [N];
а при считывании следить, чтобы длина строки не превысила N.
Для считывания безразмерных строк, имхо, удобнее использовать std::string.
Очень познавательная статья, респект автору за проделанный труд!!!
Покажите как может выглядеть код, если потребуется работа с текстом. Например: поиск запятых, подсчет определенных знаков, вводимых пользователем, подсчет слов и т.п.
Нужны примеры ввода данных и вывода. Такое условие, какое оно у Вас, может трактоваться различными вариантами.
Спасибо за проявленный интерес.
Задание такое- ввести текст в файл. Потом его вывести на экран. Далее предусмотреть работу с этим текстом, а именно поиск определенных букв или знаков. Подсчет определенных букв или знаков в этом тексте.
Я так понимаю нужно после ввода текста написать наверное switch c кейсами и предложить пользователю варианты: 1. «подсчитать символы введите нужный символ/букву и нажмите 1″
2.»подсчитать пробелы нажмите 2″, 3.»подсчитать слова нажмите 3», 4. «подсчитать предложения нажмите 4», 5. «найти и посчитать одинаковое слово, введите слово и нажмите 4». ну и т.п.
Подсчет определенных символов не стоит создания новой темы. Решение в лоб — посимвольное чтение файла.
Подсчет сколько раз какой символ встречается в файле — мода. Она же (мода) может помочь с подсчетом определенных символов.
Подсчет слов стоит создания новой темы, но у меня несколько тем по подсчету слов в строке. А файл — он как одна большая строка. Я сомневаюсь, что Вам сейчас требуется обработка слишком большого текстового файла.
Подсчет одинаковых слов. Вот это может и стоит создания темы, но я лучше помогу доделать чем опишу. Так лучше будет делающему, потому что делающий сможет столкнуться с ошибками, которых я могу не предполагать.
Это все упражнения, которые мы должны выполнять используя те знания, что у нас есть.
Хотите, чтобы помог разобраться, я согласен помочь разобраться.
Но я не согласен просто сделать готовое, хотя задача достаточно проста. (не из ряда сложных).
Добрый день! Подскажите пожалуйста как вывести все вхождения имени в текст (имя + 5 символов до и 5 символов после него).
Подскажите пожалуйста как можно сделать:
Дана строка, содержащая пробелы. Найдите в ней самое длинное слово, выведите на экран это слово и его длину.
Вход: одна строка, содержащая пробелы. Слова разделены ровно одним пробелом. Строка должна считываться методом getline (программа должна считывать только одну первую строку). Выход: самое длинное слово в строке и его длина.
Как вывести строки из файла, в которых содержится заданное слово? Пока сделал так
Нужно читать построчно.
Каждую считанную строку разбивать на массив слов.
Делать обход массива, проверяя каждую его ячейку на нужное слово.
Если слово в массиве встретится, то вывести массив, если не встретится, то ничего не выводить.
непонятно что значит — in.eof(). и в последнем листинге сначала создается массив указателей char *s[MAXLEN_STR], потом в 28 строке начинается создание count_n+1 массивов в этих указателях? (т.е. двухмерный массив)
in — Это имя. Имя некоторого рода продвинутой переменной. Тип этой продвинутой переменной — ifstream.
in — Это объект класса ifstream, у объектов классов есть дополнительные возможности, которые можно задействовать, приписав к объекту точку:
eof() — это получение флага состояния объекта. В нашем случае состояния in. Обозначает этот флаг достигнут ли конец открытого файла или нет. Название от end of file, коротко eof
=====================
Теперь о последней строке.
Это одномерный массив указателей. Его можно в показанном коде воспринимать как двумерный массив, но он не двумерный массив. Это массив, в каждой ячейке которого хранится указатель. Каждый хранимый в массиве указатель указывает на строку. Чтобы в строку, на которую указывает любой некоторый указатель из ячеек массива, можно было скопировать строку, прочитанную из файла, нужно указателю выделить памяти достаточной для того, чтобы в выделенную память смогли уместится все символы копируемой строки.
Почему не N, а N+1? — это для символа-признака конца строки (для нуль-символа) прибавляем единичку.
я понимаю что такое in и что такое eof(), я не понимаю как работает связка in.eof(), например in.get() — читает посимвольно и возвращает символы, in.getline() — записывает в буфет строку N-ного размера, а in.get() что читает, как за счет этого сочетания идет накрутка цикла? и второй вопрос: как указателю можно выделить память? вы наверно на каждый указатель создаете массив с именем соответствующего указателя, типа: S[i] = new char[MAXLEN_STR], где S[i] — индекс созданного раньше массива, new char[MAXLEN_STR] — создание массива с именем S[i]??
in выполняет роль курсора, бегающего по файлу. Прочитали символ, он сместился к следующему символу. А у всех файлов самый последний символ — это EOF.
На каждой итерации цикла внутреннее смещение. В данном случае посимвольное смещение.
getline — строка
get — символ
===============
Под указатель выделяют участки памяти, в С++ с помощью new
S — это массив указателей. Т. е. внутри него N указателей.
S[0] = new char[255]
S[1] = new char[255]
…
S[N-1] = new char[255] //последний
Мы не знаем сколько строк записано внутри файла. Поэтому первым обходом считаем это количество.
Потом вторым обходом копируем значения файла в память компьютера, в выделенные области каждой ячейке массива.
================
Вот код понятнее должен быть, наверное.
Спасибо вам большое за рабочую программу.
Но есть один нюанс о которым вы не упомянули.
Для того, чтобы программа заработала нужно:
1)В обозревателе решений нажать на проект правой кнопкой мыши.
2)Свойства.
3)С/C++.
4)Препроцессор.
5)Определение препроцессора.
6)Добавить эту строчку «_CRT_SECURE_NO_WARNINGS».
Это только каприз Visual Studio к языку С++ отношения не имеет.
Внимание на 35-ю строку, произошла поправка (при выделении памяти память обозначается как пустая строка, это важно).
42-я строка (подмена strcpy):
сделал прогу в которой первый цикл считал файл и вывел количество строк и букв в каждой строке, после хотел записать первую строку в масив и вывести на экран, а на экране выводится пустое место, что это может быть?
Я, знаете ли, не экстрасенс.
вот эта программа
Так Вы считываете строку, которая уже или не считывается, или считывается как мусорный набор символов.
Какая по Вашему считывается строка, если уже достигнут конец файла, и Вы читаете якобы следующую за концом файла строку?
После цикла надо сделать вот так:
Поскольку eof() в состоянии on, то любые попытки прочитать из файла новое значение тщетны. Перед переводом курсора в начало файла (или в какую-нибудь позицию), если уже достигнут конец файла, обязательно сбросить состояние потока.
подскажите почему не выводит текст из файла на экран, выводит просто пустую строку
Потому что Вы невнимательный молодой человек, сначала увеличили i, а потом смотрите мусорное значение, полагаясь на сбитую позицию, в mas[i] значение на этот момент ещё не записано.
я не то, что невнимательный, а просто не знаю,а как я сначала увеличил, если я записал функцию считывания до увеличения «и»??
Либо в том порядке, как у Вас, при выводе на экран и в условии использовать в индексе i-1, чтобы откатиться к правильной позиции, но лучше с одним увеличением, чем с двумя вычитаниями.
спасибо, как то не видел этого момента