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

Выбор файла для открытия - C++

Восстановить пароль Регистрация
 
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 09:23     Выбор файла для открытия #1
Добрый день, мне нужна помощь с программой, почти всё сделано, только осталось прикрутить выбор файла пользователем для редактирования(прога редактирует текст). Я пытался сам прикрутить, но видимо что-то не выходит, ошибку в упор не вижу в силу не знания тонкостей языка. Помогите пожалуйста, вот код:
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "stdafx.h"
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<locale.h>
#include <fstream>
 
using namespace std;
 
char s[10000], t[10000], r[10000], key;
int len, last, sz, sz2, beg;
bool sl, boo, pr;
string f;
char file_name[100];
//вывод меню
void Menu()
{
    system("cls");
    cout << "Меню:" << "\n";
    cout << "1. Сохранить в" << endl;
    cout << "2. Редактировать" << endl;
    cout << "3. Выход" << endl;
    cout << "4. Введите имя файла: " << endl;
}
 
//определяет, является ли символ знаком препинания
bool prep(char c)
{
    if (c == ',' || c == '.' || c == '!' || c == '?')
        return 1;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian"); //установка русского языка
    while (1)
    {
        Menu(); //вывод меню
        key =_getch(); //считываем введенный символ
        switch (key)
        {
        case'1': //сохранить в
            cout << "Введите имя выходного файла:";
            cin >> f; //запоминаем в переменную имя выходного файла
            break;
        case '2':{ //редактировать
                     //cout << f << endl;
                     ifstream in(file_name); //открываем файл на чтение
                     ofstream out(f.c_str()); //открываем файл на запись
                     while (in.getline(s, sizeof(s))) //пока считываем очередную строку
                     {
                         len = strlen(s); //длина
                         s[len++] = ' '; //добавляем пробел в конец
                         beg = -2; //начало последнего обработанного слова
                         last = -1; //конец предпоследнего обработанного слова
                         for (int i = 0; i < len; i++)
                         if (!prep(s[i]) && s[i] != ' ') //если символ принадлежит слову
                         {
                             sl = 1; //слово еще не выведено
                             if (!(sz > 1 && s[i] == t[sz - 1] && s[i] == t[sz - 2])) //избавляемся от трех и более последовательных букв
                                 t[sz++] = s[i]; //записываем слово в отдельную строку
                             if (i == 0 || (prep(s[i - 1]) || s[i - 1] == ' '))
                                 beg = i; //запоминаем начало слова
                         }
                         else
                         {
                             if (sl) //если слово еще не выведено
                             {
                                 boo = 0;
                                 //если слово равно предыдущему, то запомним это
                                 if (sz2 == sz)
                                 {
                                     for (int j = 0; j < sz; j++)
                                     if (r[j] != t[j])
                                         boo = 1;
                                 }
                                 else
                                     boo = 1;
                                 if (boo || pr) //если слово не равно предыдущему или между ними был знак препинания
                                 {
                                     for (int j = last + 1; j < beg; j++)
                                         out << s[j]; //выводим пробелы между словами
                                     for (int j = 0; j < sz; j++)
                                         out << t[j]; //выводим само слово
                                 }
                                 sl = 0; //слово выведено
                                 for (int j = 0; j < sz; j++)
                                     r[j] = t[j]; //запоминаем слово как предыдущее
                                 sz2 = sz;
                                 sz = 0;
                                 pr = 0; //знака препинания последним не было
                                 last = i - 1; //слово только что закончилось
                                 beg = -2;
                             }
                             if (prep(s[i])) //если знак препинания
                             {
                                 pr = 1; //знак препинания был
                                 last = 1e9; //чтобы не выводить лишние пробелы
                                 out << s[i] << " "; //выводим знак препинания и пробел
                             }
                         }
                         out << endl; //перевод строки
                     }
 
                     in.close(); //закрываем файл на чтение
                     out.close(); //закрываем файл на запись
 
                     break;
        }
        case '3': {return 0; } //завершаем работу//выход
        case'4':{
                    cout << "Введите имя редактируемого файла:";
                    cin >> file_name; 
        }
 
            
        }
    }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2014, 09:23     Выбор файла для открытия
Посмотрите здесь:

C++ Диалог открытия файла на winApi
C++ Открытия файла
C++ Проверка открытия файла
C++ проверка открытия файла вывода
Бинарный режим открытия файла; Битовые вхождения в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 09:32     Выбор файла для открытия #2

Не по теме:

Цитата Сообщение от Glebordan Посмотреть сообщение
C++
1
2
3
4
5
6
7
//определяет, является ли символ знаком препинания
bool prep(char c)
{
    if (c == ',' || c == '.' || c == '!' || c == '?')
        return 1;
    return 0;
}
А чем плоха библиотечная функция ispunct() (семейство функций из заголовочного файла cctype)?



Добавлено через 3 минуты
Цитата Сообщение от Glebordan Посмотреть сообщение
C++
1
cin >> f; //запоминаем в переменную имя выходного файла
попробуй вместо этого так (на тот случай, если в имени файла будут пробелы):
C++
1
getline(cin, f);   // функция считывает строку типа string целиком (включая пробелы)
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 09:38  [ТС]     Выбор файла для открытия #3
gru74ik, Спасибо, а как выбрать редактируемый файл?
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 09:53     Выбор файла для открытия #4
Цитата Сообщение от Glebordan Посмотреть сообщение
ifstream in(file_name); //открываем файл на чтение
Не откроется. У тебя это просто массив типа char, пока что никак не связанный с именем файла, введённым пользователем (строка string f).

Не по теме:

И вообще, зачем ты используешь в качестве строк в одной программе и массивы char и строки типа string? Если уж используешь string, так и используй его везде. Доступ к отдельным символам в строках типа string вполне себе возможен в нотации массивов. То есть, например:

C++
1
2
3
4
string myString;
cout << "Please enter name of file you want to open: "
getline(cin, myString);
cout << myString[0];  // будет выведен на экран первый символ строки myString



Добавлено через 7 минут
Я работать, начальник приехал. Позже загляну, подскажу может как быть.
А пока вот можешь посмотреть для примера, как тут работа с файлом организована.
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 10:14  [ТС]     Выбор файла для открытия #5
Хорошо, обязательно посмотрю, я убрал символьный массив и теперь у меня две строки(одна-имя редактируемого файла, вторая- имя файла куда сохраняется редактированный текст).

Добавлено через 12 минут
Как я понял надо создать переменную типа ifstream. Код будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <fstream>
using namespase std;
int main()
{
string file_name_to_open;
ifsream jin;
cout<<"введите имя редактируемого файла";
getline(cin, file_name_to_open);
jin.open(buf)
}
Я правильно вас понял?
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 11:02     Выбор файла для открытия #6
Цитата Сообщение от Glebordan Посмотреть сообщение
надо создать переменную типа ifstream
Объект типа ifstream. Для чтения информации из файла. Вы же пользуетесь библиотечным объектом cin для чтения из потока? А тут у вас будет свой объект (назовите его как хотите, я назвал fin), только читает он не из потока, а из файла.

А вот для записи в файл, надо будет создавать уже объект типа ofstream. Он строится по аналогии с cout. То есть, если cout выводит информацию в поток, то Ваш собственный объект (скажем, fout) выводит информацию в файл.

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

Цитата Сообщение от Glebordan Посмотреть сообщение
Я правильно вас понял?
Наверное, как-то так:
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
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
 
int main()
{
    using namespase std::string;
    using namespase std::cout;
    using namespase std::cin;
    
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
    
    string file_name_to_open;
    cout << "Введите имя редактируемого файла: "
    getline(cin, file_name_to_open);  
      
    //======================= Чтение данных из файла =======================
 
    ifstream fin;             // создание объекта fin типа ifstream    
    fin.open(file_name_to_open);    // ассоциирование создание объекта fin с файлом
                                    
    fin >> какой-то объект (читать из файла строку, например)
    //======================================================================
    return 0;
}
Добавлено через 3 минуты
upd. Я прогнал. Вы были правы насчёт строки в стиле С. Она всё-таки нужна:

Цитата Сообщение от Стивен Прата
Прата С. - Язык программирования С++. Лекции и упражнения (2013, 6-е издание):

Обратите внимание, что метод open() требует в качестве аргумента строки в
стиле С. Это может быть строковый литерал или строка, сохраненная в символьном
массиве.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1858 / 1654 / 577
Регистрация: 14.05.2014
Сообщений: 4,753
Записей в блоге: 1
Завершенные тесты: 5
22.08.2014, 11:13     Выбор файла для открытия #7
Цитата Сообщение от gru74ik Посмотреть сообщение
Я прогнал. Вы были правы насчёт строки в стиле С. Она всё-таки нужна
Не обязательно. Можно просто преобразовать.
C++
1
fin.open(file_name_to_open.c_str());
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 11:48  [ТС]     Выбор файла для открытия #8
Хмм...не выходит что-то....
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "stdafx.h"
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<locale.h>
#include <fstream>
 
using namespace std;
 
char s[10000], t[10000], r[10000], key;
int len, last, sz, sz2, beg;
bool sl, boo, pr;
string f , file_name;
//вывод меню
void Menu()
{
    system("cls");
    cout << "Меню:" << "\n";
    cout << "1. Сохранить в" << endl;
    cout << "2. Редактировать" << endl;
    cout << "3. Выход" << endl;
    cout << "4. Введите имя файла: " << endl;
}
 
//определяет, является ли символ знаком препинания
bool prep(char c)
{
    if (c == ',' || c == '.' || c == '!' || c == '?')
        return 1;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian"); //установка русского языка
    while (1)
    {
        Menu(); //вывод меню
        key =_getch(); //считываем введенный символ
        switch (key)
        {
        case'1': //сохранить в
            cout << "Введите имя выходного файла:";
            getline(cin, f); //запоминаем в переменную имя выходного файла
            break;
        case '2':{ //редактировать
                     //cout << f << endl;
                     ifstream fin;
                     fin.open(file_name.c_str()); //открываем файл на чтение
                     ofstream out(f.c_str()); //открываем файл на запись
                     while (in.getline(s, sizeof(s))) //пока считываем очередную строку
                     {
                         len = strlen(s); //длина
                         s[len++] = ' '; //добавляем пробел в конец
                         beg = -2; //начало последнего обработанного слова
                         last = -1; //конец предпоследнего обработанного слова
                         for (int i = 0; i < len; i++)
                         if (!prep(s[i]) && s[i] != ' ') //если символ принадлежит слову
                         {
                             sl = 1; //слово еще не выведено
                             if (!(sz > 1 && s[i] == t[sz - 1] && s[i] == t[sz - 2])) //избавляемся от трех и более последовательных букв
                                 t[sz++] = s[i]; //записываем слово в отдельную строку
                             if (i == 0 || (prep(s[i - 1]) || s[i - 1] == ' '))
                                 beg = i; //запоминаем начало слова
                         }
                         else
                         {
                             if (sl) //если слово еще не выведено
                             {
                                 boo = 0;
                                 //если слово равно предыдущему, то запомним это
                                 if (sz2 == sz)
                                 {
                                     for (int j = 0; j < sz; j++)
                                     if (r[j] != t[j])
                                         boo = 1;
                                 }
                                 else
                                     boo = 1;
                                 if (boo || pr) //если слово не равно предыдущему или между ними был знак препинания
                                 {
                                     for (int j = last + 1; j < beg; j++)
                                         out << s[j]; //выводим пробелы между словами
                                     for (int j = 0; j < sz; j++)
                                         out << t[j]; //выводим само слово
                                 }
                                 sl = 0; //слово выведено
                                 for (int j = 0; j < sz; j++)
                                     r[j] = t[j]; //запоминаем слово как предыдущее
                                 sz2 = sz;
                                 sz = 0;
                                 pr = 0; //знака препинания последним не было
                                 last = i - 1; //слово только что закончилось
                                 beg = -2;
                             }
                             if (prep(s[i])) //если знак препинания
                             {
                                 pr = 1; //знак препинания был
                                 last = 1e9; //чтобы не выводить лишние пробелы
                                 out << s[i] << " "; //выводим знак препинания и пробел
                             }
                         }
                         out << endl; //перевод строки
                     }
 
                     in.close(); //закрываем файл на чтение
                     out.close(); //закрываем файл на запись
 
                     break;
        }
        case '3': {return 0; } //завершаем работу//выход
        case'4':{
                    cout << "Введите имя редактируемого файла:";
                    getline(cin, file_name);
                    
 
        }
 
            
        }
    }
}
Fallenworld
75 / 75 / 9
Регистрация: 14.04.2014
Сообщений: 408
22.08.2014, 12:18     Выбор файла для открытия #9
что пишет?
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 12:53     Выбор файла для открытия #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Строчки 51-53 исправь на это:
C++
1
2
3
4
 ifstream fin;                  // создание объекта fin типа ifstream
 fin.open(file_name.c_str());   // открываем файл на чтение
 ofstream fout;                 // создание объекта fout типа ofstream
 fout.open(f.c_str());          // открываем файл на запись
И заголовочные файлы не забудь:
C++
1
2
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
Добавлено через 14 минут
Вместо
Цитата Сообщение от Glebordan Посмотреть сообщение
C++
1
while (in.getline(s, sizeof(s))) //пока считываем очередную строку
кажется, должно быть так:
C++
1
while (fin.getline(s, sizeof(s))) //пока считываем очередную строку
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 12:57  [ТС]     Выбор файла для открытия #11
Fallenworld, Да так-то компилируется, но не отзывается
gru74ik, Спасибо, сейчас попробую
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 13:00     Выбор файла для открытия #12
И дальше в коде имена не путай. А то у тебя то fin и fout, то in и out.
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 13:01  [ТС]     Выбор файла для открытия #13
Теперь почему-то на операторы вывода ругается:
C++
1
2
3
4
5
6
7
if (boo || pr) //если слово не равно предыдущему или между ними был знак препинания
                                 {
                                     for (int j = last + 1; j < beg; j++)
                                         out << s[j]; //выводим пробелы между словами
                                     for (int j = 0; j < sz; j++)
                                         out << t[j]; //выводим само слово
                                 }
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 13:03     Выбор файла для открытия #14
C++
1
2
3
4
5
6
7
if (boo || pr) //если слово не равно предыдущему или между ними был знак препинания
                                 {
                                     for (int j = last + 1; j < beg; j++)
                                         fout << s[j]; //выводим пробелы между словами
                                     for (int j = 0; j < sz; j++)
                                         fout << t[j]; //выводим само слово
                                 }
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 13:05  [ТС]     Выбор файла для открытия #15
Да, я это исправил,только не помогло это, он не открывает файл который я ему указываю...
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 13:07     Выбор файла для открытия #16
Цитата Сообщение от Glebordan Посмотреть сообщение
он не открывает файл который я ему указываю..
Заголовочные файлы не забыл?
C++
1
2
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 13:27  [ТС]     Выбор файла для открытия #17
Нет, не забыл, а не может быть так, что файл с текстом должен находиться в папке проекта? Но думаю ошибка не в этом, я всегда пишу полное имя файла...

Добавлено через 18 минут
У меня сейчас вот так:
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "stdafx.h"
#include<cstdio>
#include<cstring>
#include<string>
#include <fstream>      // для чтения из файла
#include <ostream> 
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<locale.h>
#include <fstream>
 
using namespace std;
 
char s[10000], t[10000], r[10000], key;
int len, last, sz, sz2, beg;
bool sl, boo, pr;
string f , file_name;
//вывод меню
void Menu()
{
    system("cls");
    cout << "Меню:" << "\n";
    cout << "1. Сохранить в" << endl;
    cout << "2. Редактировать" << endl;
    cout << "3. Выход" << endl;
    
}
 
//определяет, является ли символ знаком препинания
bool prep(char c)
{
    if (c == ',' || c == '.' || c == '!' || c == '?')
        return 1;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian"); //установка русского языка
    while (1)
    {
        Menu(); //вывод меню
        key =_getch(); //считываем введенный символ
        switch (key)
        {
        case'1': //сохранить в
            cout << "Введите имя выходного файла:";
            getline(cin, f); //запоминаем в переменную имя выходного файла
            break;
        case '2':{ 
                     //cout << f << endl;
                     cout << "Введите имя редактируемого файла:";
                     getline(cin, file_name);
                     ifstream fin;                  // создание объекта fin типа ifstream
                     fin.open(file_name.c_str());   // открываем файл на чтение
                     ofstream fout;                 // создание объекта fout типа ofstream
                     fout.open(f.c_str());          // открываем файл на запись
                     while (fin.getline(s, sizeof(s))) //пока считываем очередную строку
                     {
                         len = strlen(s); //длина
                         s[len++] = ' '; //добавляем пробел в конец
                         beg = -2; //начало последнего обработанного слова
                         last = -1; //конец предпоследнего обработанного слова
                         for (int i = 0; i < len; i++)
                         if (!prep(s[i]) && s[i] != ' ') //если символ принадлежит слову
                         {
                             sl = 1; //слово еще не выведено
                             if (!(sz > 1 && s[i] == t[sz - 1] && s[i] == t[sz - 2])) //избавляемся от трех и более последовательных букв
                                 t[sz++] = s[i]; //записываем слово в отдельную строку
                             if (i == 0 || (prep(s[i - 1]) || s[i - 1] == ' '))
                                 beg = i; //запоминаем начало слова
                         }
                         else
                         {
                             if (sl) //если слово еще не выведено
                             {
                                 boo = 0;
                                 //если слово равно предыдущему, то запомним это
                                 if (sz2 == sz)
                                 {
                                     for (int j = 0; j < sz; j++)
                                     if (r[j] != t[j])
                                         boo = 1;
                                 }
                                 else
                                     boo = 1;
                                 if (boo || pr) //если слово не равно предыдущему или между ними был знак препинания
                                 {
                                     for (int j = last + 1; j < beg; j++)
                                         fout << s[j]; //выводим пробелы между словами
                                     for (int j = 0; j < sz; j++)
                                         fout << t[j]; //выводим само слово
                                 }
                                 sl = 0; //слово выведено
                                 for (int j = 0; j < sz; j++)
                                     r[j] = t[j]; //запоминаем слово как предыдущее
                                 sz2 = sz;
                                 sz = 0;
                                 pr = 0; //знака препинания последним не было
                                 last = i - 1; //слово только что закончилось
                                 beg = -2;
                             }
                             if (prep(s[i])) //если знак препинания
                             {
                                 pr = 1; //знак препинания был
                                 last = 1e9; //чтобы не выводить лишние пробелы
                                 fout << s[i] << " "; //выводим знак препинания и пробел
                             }
                         }
                         fout << endl; //перевод строки
                     }
 
                     fin.close(); //закрываем файл на чтение
                     fout.close(); //закрываем файл на запись
 
                     break;
        }
        case '3': {return 0; } //завершаем работу//выход
        
                    
 
        }
 
            
        }
    }
Путь к тексту ввожу- D:\\D.txt -, а вот сохранять файлы он не хочет, хотя и можно ввести имя файла....
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
22.08.2014, 14:37     Выбор файла для открытия #18
У меня работает:

Кликните здесь для просмотра всего текста
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <ostream>      // для вывода в файл
#include <fstream>      // для чтения из файла
#include <limits>       // для cin.ignore(numeric_limits<streamsize>::max(), '\n');
 
int main()
{
    using namespace std;
 
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    string fileName;
    string fileContent;
 
    cout << "\nЖелаете сохранить введённые Вами данные в файл? (да/нет): ";
    char userAnswer;  // переменная для ответа пользователя
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();    // очистка буфера после ввода
 
    // варианта утвердительного ответа, начинающиеся
    // на соответствующие символы:
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВведённые Вами данные будут сохранены в файл.\n"
                "Введите имя файла: ";
        getline (cin, fileName);
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.clear();    // очистка буфера после ввода
 
        cout << "Введите текст, который будет записан в файл:\n";
        getline (cin, fileContent);
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.clear();    // очистка буфера после ввода
 
        ofstream fout;          // создание объекта fout типа ofstream
        fout.open(fileName.c_str()); // ассоциирование объекта c файлом
        fout << fileContent;
        fout.close ();  // закрытие соединения вывода с файлом
        cout << "\nДанные были успешно сохранены." << endl;
    }
 
    else
    {
        cout << "\nВы отказались от сохранения данных в "
                 "текстовый файл. Программа будет завершена." << endl;
 
        //--------- Специальный блок для красоты ---------
        //================================================
        // С небольшой задержкой будут выведены 10 точек
        // одна за другой, как будто программа думает:
        cout << endl;
        for (int i=0; i<20; i++)
        {
        Sleep(100);
        cout << "*";
        }
        cout << endl;
        //------------------------------------------------
 
        return 0;   // успешное завершение программы
    }
 
    cout << endl << endl;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.clear();    // очистка буфера после ввода
 
    cout << "Желаете вывести на экран введённые Вами данные\n"
            "из файла " << fileName <<" (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
 
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.clear();    // очистка буфера после ввода
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВы сохранили следующие данные в файле "
             << fileName <<": " <<endl;
 
        ifstream fin;               // создание объекта fin типа ifstream
        fin.open(fileName.c_str()); // ассоциирование объекта c файлом
 
        string wroteFromFile;
        getline (fin, wroteFromFile); // читаем из файла
        cout << endl << wroteFromFile << endl; // выводим на экран, что прочитали
        fin.close ();   // закрытие соединения ввода с файлом
    }
 
    else
    {
        cout << "\nВы отказались от вывода данных на "
                "экран. Программа будет завершена.";
                
        //--------- Специальный блок для красоты ---------
        //================================================
        // С небольшой задержкой будут выведены 10 точек
        // одна за другой, как будто программа думает:
        cout << endl;
        for (int i=0; i<20; i++)
        {
        Sleep(100);
        cout << "*";
        }
        cout << endl;
        //------------------------------------------------
    }
 
    return 0;   // успешное завершение программы
}


Пишет текст в файл. Потом выводит записанный текст из файла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2014, 16:16     Выбор файла для открытия
Еще ссылки по теме:

C++ Какая команда служит для открытия файла на компьютере?
C++ Пользовательская функция для создания/открытия файла
C++ Функция открытия файла

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

Или воспользуйтесь поиском по форуму:
Glebordan
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 36
22.08.2014, 16:16  [ТС]     Выбор файла для открытия #19
gru74ik, надеюсь вы меня поймёте, кажется проблема вот в чём, в первом пункте я ввожу имя файла в который я сохраняю редактированный текст. Вооооот....а я ведь прикрутил выбор файла из которого производится чтение во второй пункт, это ведь ошибка?

Добавлено через 2 минуты
Дааааа, я был прав, спасибо вам большое, всё исправно работает, просто код корявый
Yandex
Объявления
22.08.2014, 16:16     Выбор файла для открытия
Ответ Создать тему
Опции темы

Текущее время: 00:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru