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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.86
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

Открытие файла - C++

09.08.2012, 20:05. Просмотров 3606. Ответов 92
Метки нет (Все метки)

У меня есть файл в котором сначала хранится количество наименований файлов,а потом названия файлов
пример
2!
1.txt!
2.txt!

! используются как разделители
Как именно открыть файл,чтоб данные не стёрлись,но я мог например перместиться в начало файла и записать новое кол-во файлов,стерев старое.

тут пример того,как я открываю файл,записываю новое кол-во файлов и дописываю в конец названия,однако на деле ф вайле лишь 0! и всё
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
int CountOfFiles = 0;
int NumberOfFile = 0;
int NumberOfWords = 0;
int OldCountOfFiles;
 
int main()
{
    setlocale(0,"");
 
    fstream data;
    vector<string> NameOfFiles;
 
    if(access("info.txt", 0) == -1)
    {
        data.open("info.txt",ios::out);
 
        data << CountOfFiles << '!' << endl;
        data.close();
    }
    else
    {
    data.open("info.txt", ios::in);
    data.seekp(0);
    data >> CountOfFiles;
    data.close();
    }
 
    if(CountOfFiles)
    {
 
        data.open("info.txt", ios::in);
        data.seekp(6);
 
        for(int i = 0;i < CountOfFiles;i++)
            data >> NameOfFiles[i];
 
        data.close();
    }
    else
        cout << "Файлов ещё нет!" << endl;
 
 
    if(CountOfFiles)
        {
                for(int i = 0;i < CountOfFiles;i++)
                cout << i+1 << " - " << NameOfFiles[i] << endl;
 
                cout << "Выберите файл" << endl;
 
                /*cin >> NumberOfFile;*/
        }
 
    cout << "Введите название файла" << endl;
 
    string Temp;
 
    cin >> Temp;
    Temp += ".txt";
 
    CountOfFiles++;
 
    data.open("info.txt",ios::ate);
 
    data.seekp(0);
    data << CountOfFiles;
    data.seekp(0,ios::end);
    data << Temp << endl;
 
    data.close();
 
    system("pause");
 
    return 0;
}
Добавлено через 21 минуту
Цитата Сообщение от alexey31415 Посмотреть сообщение
! используются как разделители
уже не актуально,я от этого отказался

на данный момент у меня не получается записать данные о новом количестве файлов и дописать новые названия

Добавлено через 16 часов 43 минуты
Цитата Сообщение от alexey31415 Посмотреть сообщение
data.open("info.txt",ios::ate);
не получается открыть файл в этом месте(строка 62)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 20:05     Открытие файла
Посмотрите здесь:

открытие файла - C++
ifstream is; cout&lt;&lt;endl&lt;&lt;&quot;Name file: &quot;; cin&gt;&gt;name; is.open(name, ios::binary); if(!is.is_open()) { ...

Открытие файла. - C++
Простите, а возможно ли сделать так: допустим я задаю вопрос в консоли: хотите открыть такой-то файл? если да - то он соответственно...

Открытие файла - C++
Здравствуйте, интересует вопрос, можно ли сделать так, чтобы программа открывала нужный файл (наприм. картинку), если можно то как?

Открытие файла на C++ - C++
Здравствуйте. Появился вопрос, если, допустим, писать батник, то для открытия файла нужно писать start (или open) &quot;Путь к файлу&quot;... А...

Поиск и открытие файла! - C++
Нужно собственно произвести поиск на Hdd файла, по имени с последующим запуском этого файла К примеру есть плеер, нужно чтобы он запросил...

Открытие файла напрямую... - C++
Проблемка связана, с тем что в коде, у меня не поулчается открыть файл... Т.е. у меня на экран должен вылетить вопрос введите путь к...

Открытие текстового файла - C++
вроде бы все пишу правильно, но текст с файла не отображает. Если писать через ofstream весь текст в файле удаляет, но в консоле все равно...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.08.2012, 20:25     Открытие файла #61
Вот пока код для текстового режима. Нормально работает.
Код
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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <cstdlib>
#include <string>
using namespace std;
 
int main()
{
    setlocale(0,"");
 
    int CountOfFiles = 0;
 
    fstream data("info.txt");
    
    //если файл ещё не существует
    if(!data.is_open())
    {
        ofstream out("info.txt");
        out << CountOfFiles << '\n';
        out.close();
        out.clear();
        cout << "Файлов ещё нет!" << endl;
    }
    else
    {
        data >> CountOfFiles;
        data.close();
        data.clear();
    }
        
    cout << "Введите название файла" << endl;
    string Temp;
    cin >> Temp;
    Temp += ".txt";
    
    fstream data2("info.txt");
    
    //записываем новое кол-во файлов
    CountOfFiles++;
    data2.seekp(0, ios::beg);
    data2 << CountOfFiles << '\n';
    
    //пишем название нового файла.
    data2.seekp(0, ios::end);
    data2 << Temp << '\n';
    
    data2.close();
    data2.clear();
    
    system("pause");
    return 0;
}
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.08.2012, 20:35  [ТС]     Открытие файла #62
а где считывание данных из файла
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.08.2012, 20:48     Открытие файла #63
Это, соответственно, для бинарного:
Код
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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <cstdlib>
#include <string>
using namespace std;
 
int main()
{
    setlocale(0,"");
 
    int CountOfFiles = 0;
 
    fstream data("info.txt");
    
    //если файл ещё не существует
    if(!data.is_open())
    {
        ofstream out("info.txt");
        //out << CountOfFiles << '\n';
        out.write(reinterpret_cast<const char *>(&CountOfFiles), sizeof(CountOfFiles));
        out.close();
        out.clear();
        cout << "Файлов ещё нет!" << endl;
    }
    else
    {
        //data >> CountOfFiles;
        data.read(reinterpret_cast<char *>(&CountOfFiles), sizeof(CountOfFiles));
        data.close();
        data.clear();
    }
        
    cout << "Введите название файла" << endl;
    string Temp;
    cin >> Temp;
    Temp += ".txt";
    
    fstream data2("info.txt");
    
    //записываем новое кол-во файлов
    CountOfFiles++;
    data2.seekp(0, ios::beg);
    //data2 << CountOfFiles << '\n';
    data2.write(reinterpret_cast<const char *>(&CountOfFiles), sizeof(CountOfFiles));
    
    //пишем название нового файла.
    data2.seekp(0, ios::end);
    //data2 << Temp << '\n';
    data2.write((const char*)&(Temp[0]), Temp.size());
    
    data2.close();
    data2.clear();
    
    system("pause");
    return 0;
}

Цитата Сообщение от alexey31415 Посмотреть сообщение
а где считывание данных из файла
Вы хотите, чтобы за вас всё сделали? Новое количество файлов записывается, новые имена файлов записываются, старые данные не стираются. Что ещё нужно? Какие проблемы при считывании?
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.08.2012, 22:17  [ТС]     Открытие файла #64
да уже собственно помогли мне,там я не требовал от вас кода

Добавлено через 1 час 25 минут
сейчас всё работает должным образом
всем спасибо,кто помогал мне справиться с моей проблемой
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.08.2012, 23:26     Открытие файла #65
Цитата Сообщение от alexey31415 Посмотреть сообщение
сейчас всё работает должным образом
Код который работает, можно, посмотреть? Каким путём пошли?

Добавлено через 54 минуты
Вот рабочий код с выводом данных из файла.
Код
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
#include<iostream>
#include <fstream>
#include <Windows.h>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    setlocale(0,"");
 
    int CountOfFiles = 0;
 
    fstream data("info.txt", ios::in | ios::binary);
    
    //если файл ещё не существует
    if(!data.is_open())
    {
        ofstream out("info.txt", ios::binary);
        // запись количества файлов.
        out.write(reinterpret_cast<const char *>(&CountOfFiles), sizeof(CountOfFiles));
        out.close();
        out.clear();
        cout << "Файлов ещё нет!" << endl;
    }
    else
    {
        // запись количества файлов.
        data.read(reinterpret_cast<char *>(&CountOfFiles), sizeof(CountOfFiles));
        data.close();
        data.clear();
    }
        
    cout << "Введите название файла" << endl;
    string Temp;
    cin >> Temp;
    Temp += ".txt";
    
    fstream data2("info.txt", ios::out | ios::in | ios::binary);
    
    //записываем новое кол-во файлов.
    CountOfFiles++;
    data2.seekp(0, ios::beg);
    data2.write(reinterpret_cast<const char *>(&CountOfFiles), sizeof(CountOfFiles));
    
    //пишем название нового файла.
    data2.seekp(0, ios::end);
    data2.write((const char*)&(Temp[0]), Temp.size());
    
    // дописываем после каждой строки символ \n, для правильного считывания getline().
    char ch = '\n';
    data2.write(&ch, sizeof(ch));
    
    data2.close();
    data2.clear();
    
    data2.open("info.txt");
    
    vector <string> vstr; // для хранения названий файлов.
    char buff[255]; // буффер для заполнения вектора строками.
    int n = 0; // для хранения количества файлов.
    
    // считываем количество файлов в n.
    data2.read(reinterpret_cast<char *>(&n), sizeof(int));
    
    // считывание названий файлов в вектор.
    for (int i = 0; i < n; i++)
    { 
        data2.getline(buff, 255);
        vstr.push_back(buff);
    }
    
    cout << "Количество файлов - " << n << endl;
    
    // распечатка вектора строк с названиями файлов.
    for (int i = 0; i < vstr.size(); i++)
            cout << vstr[i] << endl;
 
    data2.close();
    data2.clear();
        
    system("pause");
    return 0;
}
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
11.08.2012, 23:31     Открытие файла #66
alsav22, код изврат... мешать не гуд
alsav22
11.08.2012, 23:59
  #67

Не по теме:

Нет предела совершенству. Надо над ним ещё подумать, может, что и получше получится. Но рабочий, и пока это главное. Вы, кстати, свой код проверяли из 52 поста? Не рабочий.
Предложите приемлемый способ считывания строк из бинарного файла, если неизвестна длина каждой строки. И поясните, если не трудно, насчёт "мешать". Что у меня с чем смешанно?

Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
12.08.2012, 00:32     Открытие файла #68
Вы, кстати, свой код проверяли из 52 поста? Не рабочий.
Вообщето проверял, а вы ? В чем его не рабочесть ?
Если вы не заметели это измененный код ТС.
Предложите приемлемый способ считывания строк из бинарного файла, если неизвестна длина каждой строки.
Для этого не предназначены бинарники, разве что хранить вначале длину строки...
Более того нет смысла пытаться достичь такой цели так как максимальная длина пути к файлу обычно ограничена каким либо числом.
Избыточность в бинарниках цена за произвольный доступ.
поясните, если не трудно, насчёт "мешать". Что у меня с чем смешанно?
Записываете в бинарном виде, а пытаетесь прочитать в текстовом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 data2.open("info.txt"); /* в текстовом !!! */
    
    vector <string> vstr; // для хранения названий файлов.
    char buff[255]; // буффер для заполнения вектора строками.
    int n = 0; // для хранения количества файлов.
    
    // считываем количество файлов в n.
    data2.read(reinterpret_cast<char *>(&n), sizeof(int)); /* бинарном !!! */
    
    // считывание названий файлов в вектор.
    for (int i = 0; i < n; i++)
    { 
        data2.getline(buff, 255);/* текстовом !!! */
        vstr.push_back(buff);
    }
Никто не спорит что это может работать, но это потенциальное место ошибок...
alsav22
12.08.2012, 00:50
  #69

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
В чем его не рабочесть ?
Только последняя запись остаётся в файле.

Цитата Сообщение от Avazart Посмотреть сообщение
Если вы не заметели это измененный код ТС.
Я это понял. Я без претензий, просто к слову пришлось.

Цитата Сообщение от Avazart Посмотреть сообщение
Записываете в бинарном виде, а пытаетесь прочитать в текстовом.
Вы так пишите, как будто у меня не получается считывать. Замечательно считывается. Я конечно не большой спец, но мне кажется, в основе всё равно лежит только двоичный код. Как он трактуется разными функциями, это уже другой вопрос. getline() читает из файла по байту двоичный код, вне зависимости от того под каким видом он туда записывался, как коды символов (а в данном коде, он именно так и записывался) или как-то по другому. По моему, вы мою мысль поняли. Теперь, если можно, более конкретный вопрос.
...но это потенциальное место ошибок
Пример можете привести, когда мой код будет некорректно работать? Это для дальнейшего усовершенствования. И второй. Вот эту функцию: access() - у меня компилятор не принимает. Что нужно сделать, чтобы принял.

Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
12.08.2012, 01:04     Открытие файла #70
Только последняя запись остаётся в файле.
Да вроде как нормально работает ( main - программа )

Bash
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
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
Файлов ещё нет!
Введите название файла
Максимум 28 символов
1.txt
 
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
1 - 1.txt
Введите название файла
Максимум 28 символов
Рабочий стол/2.txt
 
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
1 - 1.txt
2 - Рабочий стол/2.txt
Введите название файла
Максимум 28 символов
3.txt
 
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
1 - 1.txt
2 - Рабочий стол/2.txt
3 - 3.txt
Введите название файла
Максимум 28 символов
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2012, 01:16     Открытие файла #71
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
1 - 1.txt
2 - Рабочий стол/2.txt
3 - 3.txt
Введите название файла
Максимум 28 символов
Я в том коде не вижу вывода из файла. Это откуда вывод? Из файла?

Добавлено через 4 минуты
~/Рабочий стол/Linux,Проекты /g++/10$ ./main
1 - 1.txt
2 - Рабочий стол/2.txt
3 - 3.txt
Введите название файла
Максимум 28 символов
Я в том коде не вижу вывода из файла. Это откуда вывод? Из файла?
У меня компилятор не принимает вот эту функцию: access(). Приходится код немного переделывать. Может из-за этого расхождение. И ещё вот это не принимает: MAX_PATH. Где-то уже определено.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
12.08.2012, 01:16     Открытие файла #72
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы так пишите, как будто у меня не получается считывать. Замечательно считывается.
Цитата Сообщение от Avazart Посмотреть сообщение
Никто не спорит что это может работать, но это потенциальное место ошибок...
Цитата Сообщение от alsav22 Посмотреть сообщение
основе всё равно лежит только двоичный код. Как он трактуется разными функциями, это уже другой вопрос
Важно то как это будет трактоваться другим программистом который будет читать ваш код.

Цитата Сообщение от alsav22 Посмотреть сообщение
Пример можете привести, когда мой код будет некорректно работать? Это для дальнейшего усовершенствования.
Код непрозрачен, а значет его легче выкинуть нежели усоветшенствовать, тем более что в таких изощрениях нет необходимости в данном случае.
alsav22
12.08.2012, 01:19
  #73

Не по теме:

В догонку. Одно место можно так переписать:

C++
1
data2.open("info.txt", ios::out | ios::in | ios::binary );
Остаётся только одно место, где считывание, якобы, в текстовам виде. Что означает непрозрачен.?

Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
12.08.2012, 01:21     Открытие файла #74
Все согласно исходному коду TC

Код
~/Рабочий стол/Linux,Проекты /g++/10$ ./main  //- запуск программы
1 - 1.txt    // вывод программы
Введите название файла
Максимум 28 символов
Рабочий стол/2.txt // я ввожу новый файл на добавление
Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Что означает непрозрачен.?
В использовании разных режимов записи и чтения.
seek() уже стрЁмно использовать для произвольного доступа к определенному пути.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 02:47     Открытие файла
Еще ссылки по теме:

Открытие файла по команде - C++
Моей програмке очень нужна одна функция, а именно: получая команду от определенного компьютера открывать файл. То есть есть компьютеры 1 и...

Открытие и сохранение файла - C++
Привет всем, подскажыте как открыть файл в С++ без Опен диалога и как збереч его, при етом с файла нужно считать инфу. (Файл в форматие...

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

Открытие файла по пути - C++
мне надо открыть файл который выбирается пользователем в диалоговом окне, но путь сохраняется без двойных слэшев как принято в С++ , что...

открытие с файла с флешки - C++
проблема такая открываю проект с флещки в студио 2010 она запустилась,но синий экран почему то самого кода не видно,что нужно сделать


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2012, 02:47     Открытие файла #75
Только бинарное чтение-запись.
Код
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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    setlocale(0,"");
    
    int CountOfFiles = 0;
 
    fstream data("info.txt", ios::in | ios::binary);
    
    if(!data.is_open()) //если файл ещё не существует
    {
        ofstream out("info.txt", ios::binary);
        // запись количества файлов.
        out.write((const char*)(&CountOfFiles), sizeof(CountOfFiles));
        out.close();
        out.clear();
        cout << "Файлов ещё нет!" << endl;
    }
    else // если существует.
    {
        // запись количества файлов.
        data.read((char*)(&CountOfFiles), sizeof(CountOfFiles));
        data.close();
        data.clear();
    }
        
    cout << "Введите название файла" << endl;
    string Temp;
    getline(cin, Temp);
    
    fstream data2("info.txt", ios::out | ios::in | ios::binary);
    
    //записываем новое кол-во файлов.
    CountOfFiles++;
    data2.seekp(0, ios::beg);
    data2.write((const char*)(&CountOfFiles), sizeof(CountOfFiles));
    
    //пишем название нового файла.
    data2.seekp(0, ios::end);
    data2.write((const char*)&(Temp[0]), Temp.size());
    
    // дописываем после каждой строки 0.
    char ch = 0;
    data2.write(&ch, sizeof(ch));
    
    data2.close();
    data2.clear();
    
    data2.open("info.txt", ios::out | ios::in | ios::binary);
    
    vector <string> vstr; // для хранения названий файлов.
    int n = 0; // для хранения количества файлов.
    
    // считываем количество файлов в n.
    data2.read((char*)(&n), sizeof(n));
    
    // считывание названий файлов в вектор.
    for (int i = 0; i < n; i++)
    { 
        char temp;
        string str_temp;
    // считываем из файла символы и добавляем в строку, пока не конец строки в файле.
        do
        {
            data2.read(&temp, sizeof(temp));
            str_temp.push_back(temp);
        } while (temp != 0);
        
        vstr.push_back(str_temp); // добавляем строку в вектор.
    }
 
    cout << "Количество файлов - " << n << endl;
    
    // распечатка вектора строк с названиями файлов.
    for (auto i = vstr.begin(); i != vstr.end(); i++)
            cout << *i << endl;
 
    data2.close();
    data2.clear();
        
    system("pause");
    return 0;
}
Yandex
Объявления
12.08.2012, 02:47     Открытие файла
Закрытая тема Создать тему
Опции темы

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