Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
#1

Изучение работы с файломи .txt - C++

10.10.2012, 22:43. Просмотров 678. Ответов 13
Метки нет (Все метки)

Всем добрый день!
Сейчас изучаю Си/Си++ и вот внезапно надоело работать только с консолью. Хочется входные и выходные данные иметь в файликах .txt. Все бы хорошо, но пристойных мануалов, как это делать, так и не нашла. Обычно либо дают какие-то куски кода с кучей непонятно откуда взятых слов/функций, либо целые фрагменты кода, которые, однако, при компиляции в VS 2012 выдают ошибку.
Просто мечтаю о внятной статье или главе из книги, объясняющей по шагам, как в VS прикрутить работу с блокнотными файлами. Подскажете что-нибудь?
А, еще часто встречаю следующие конструкции: "слово::слово" и "слово.слово". Подскажите, что это, зачем нужно, и где про это почитать доступно. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2012, 22:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Изучение работы с файломи .txt (C++):

Работа с файломи... - C++
#include <iostream> #include <fstream> using namespace std; int main() { ifstream f("file.txt"); while (true) { int...

Работа с файломи - C++
Здравствуйте. Нужна программа которая бы делала следующее. У нас есть неопределенное количество файлов. Пользователь с помощью стандартного...

Работа с файломи - C++
Дан текстовый файл. Подсчитать количество знаков препинания (Х) и количество слов (Y) Если выполняется условие Y / X <= 6 , то...

Работа с файломи - C++
1) Дан текстовый файл. Подсчитать количество знаков препинания (Х) и количество слов (Y) Если выполняется условие Y / X <= 6 , то...

Ошибка в C++, рабта с файломи - C++
(*файлами) Когда я компилирую программу мне выдает ошибку. (Ошибку из терминала вставить не могу, она слишком большая по объему) Код:...

Потоки.Работа с файломи.Очередь.Стек. - C++
Полностью рабочий код с очередью.#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <conio.h> #include <tchar.h> ...

13
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.10.2012, 22:49 #2
Литература C++
там достаточно много хороших книжек.
Даже не знаю, стоит ли отвечать на ваши вопросы про "слово::слово" и "слово.слово" - боюсь слишком запутать. Об этом обычно пишут в начале самоучителей.

Для работы с файлами надо подключить библиотеку fstream
затем создать необходимый объект - std::ifstream, std::ofstream или std::fstream
открыть нужный файл с помощью метода open(file_name)
далее можно записывать туда данные и считывать их обратно с помощью операторов << и >>. Будто бы вы работаете с cin/cout
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.10.2012, 14:19 #3
Цитата Сообщение от Detweeted Посмотреть сообщение
Сейчас изучаю Си/Си++
Каким образом изучаете? Наберите в поисковике: потоковый ввод вывод с++ и читайте. Информации в инете полно. Вот здесь, для начала, очень просто объясняется: http://informatics.mccme.ru/moodle/mod/book/view.php?id=579
0
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
11.10.2012, 21:02  [ТС] #4
Спасибо за пояснения! Изучаю по гуглу/конспектам первого курса и по паре книжек.

А чем freopen отличается от fopen? Они относятся к разным пространствам имен?
0
Петррр
5965 / 3402 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
11.10.2012, 21:05 #5
http://lord-n.narod.ru/download/book...13/freopen.htm
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.10.2012, 21:19 #6
Цитата Сообщение от Detweeted Посмотреть сообщение
и по паре книжек.
По каким?
Цитата Сообщение от Detweeted Посмотреть сообщение
А чем freopen отличается от fopen?
freopen связывает существующий поток с другим файлом.
0
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
11.10.2012, 21:29  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
По каким?
Керниган, Ритчи - базовая часть, Девис (для чайников) - объектно ориентированные штучки.

Цитата Сообщение от Петррр Посмотреть сообщение
Спасибо, сейчас буду разбираться.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.10.2012, 22:08 #8
Цитата Сообщение от Detweeted Посмотреть сообщение
Керниган, Ритчи - базовая часть
Там есть глава: "Ввод и вывод".
0
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
11.10.2012, 22:19  [ТС] #9
Для теста наугад написала код, а он работает почему-то не для строк, а для слов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//равны ли строки?
 
#define N 20
 
#include <iostream>
#include <string>
#include <stdio.h>
 
 
using namespace std;
 
int main()
{
     freopen ("input.txt","r",stdin);
     freopen ("output.txt","w",stdout);
     char s1[N], s2[N];
     cin >> s1 >> s2;
     if (strcmp(s1, s2))
         cout << "не равны";
     else
         cout << "равны";
     return 0; 
}
Если в файле input оставить два слова, разделенные пробелом, то каждое слово будет восприниматься как строка. Почему так? Ведь строка должна заканчиваться символом /0, а пробел не то же самое, что /0?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.10.2012, 23:09 #10
cin >> читает до пробела. Если хотите чтение строки, то используйте функции для строкового ввода.

Добавлено через 3 минуты
У вас смесь С и С++. Если испоьзуете iostream, тогда уж используйте и fstream. Если string, то зачем char[]. Читайте в string и сравнивайте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
     fstream f("input.txt");
     
     string s1, s2;
     getline(getline(f, s1), s2);
     f.close();
 
     f.open("output.txt", ios::out);
     if (s1 != s2)
         f << "не равны";
     else
         f << "равны";
 
     f.close();
 
     cin.get();
     return 0; 
}
1
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
12.10.2012, 20:13  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
     getline(getline(f, s1), s2);
Вот это что-то очень подозрительное. Смотрим описание getline: Getline возвращает 1, если запись существует, 0 - если найден конец файла и -1, если появляется ошибка. В качестве аргументов у getline должны быть название строки и лимит символов в строке.
Тут полное несоответствие. И рекурсия непонятно зачем. Поясните?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 22:00 #12
Цитата Сообщение от Detweeted Посмотреть сообщение
Вот это что-то очень подозрительное. Смотрим описание getline: Getline возвращает 1, если запись существует, 0 - если найден конец файла и -1, если появляется ошибка. В качестве аргументов у getline должны быть название строки и лимит символов в строке.
Тут полное несоответствие. И рекурсия непонятно зачем. Поясните?
Где такое нашли? Есть методы getline() (члены класса istream). Они вызываются объектами класса. Например, cin.getline(char*, int, char = '\n'). А это просто шаблонная функция. Здесь почитатайте: http://www.cplusplus.com/reference/string/getline/ Рекурсии здесь нет.
Эта getline() возвращает поток, т.е. в данном случае: f. Можно написать то же самое, но понятнее:
C++
1
2
getline(f, s1);
getline(f, s2);
1
Detweeted
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 21
14.10.2012, 16:02  [ТС] #13
А существует возможность начать запись в файл в main(), потом в самом main() вызвать некую функцию, в ней продолжить дозапись файла, потом вернуть в main() и записывать дальше? Какие аргументы мы должны передавать в функцию?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 17:35 #14
Цитата Сообщение от Detweeted Посмотреть сообщение
Какие аргументы мы должны передавать в функцию?
Поток по ссылке. Например, шесть строк в файле:
C++
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
void func(fstream &f, string &s1, string &s2) // чтение двух строк из файла
{
    getline(getline(f, s1), s2);
}
 
int main()
{
     fstream f("1.txt");
     
     string s1, s2;
     getline(getline(f, s1), s2); // чтение двух строк из файла
     
     func(f, s1, s2);
     cout << s1 << endl << s2 << endl;
     
     getline(getline(f, s1), s2); // чтение двух строк из файла
 
     cout << s1 << endl << s2 << endl;
 
     f.close();
 
     cin.get();
     return 0; 
}
1
14.10.2012, 17:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 17:35
Привет! Вот еще темы с ответами:

В папке К2 создайте файл t3.txt, в который перепишите вначале текст из файла t1.txt, а затем из t2.txt - C++
Программным путем: 1. В папке С:\temp создайте папки К1 и К2. 2. В папке К1: a) создайте файл t1.txt, в который запишите следующий...

Записать в text3.txt строки, которые есть и в text1.txt, и в text2.txt - C++
Здравствуйте, нужно записать в text3.txt строки, которые есть и в text1.txt, и в text2.txt помогите, пожалуйста

Переписать все числа из файлов 1.txt и 2.txt в файл 3.txt - C++
Здравствуйте! Нужна помощь. Есть два текстовых файла 1.txt и 2.txt в них есть числа. реализовать консольное приложение которое...

Создание файлов a.txt, b.txt...z.txt - C++
В задаче требуется написать программу, которая создаёт файлы a.txt, b.txt...z.txt и пишет в них какую-нить фигню. Проблема в том, что в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru