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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.86
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.08.2012, 20:05     Открытие файла #1
У меня есть файл в котором сначала хранится количество наименований файлов,а потом названия файлов
пример
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++
Открытие файла C++
Открытие файла. C++
открытие файла Си++ C++
C++ Открытие файла на C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.08.2012, 20:35  [ТС]     Открытие файла #62
а где считывание данных из файла
alsav22
5282 / 4801 / 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
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.08.2012, 22:17  [ТС]     Открытие файла #64
да уже собственно помогли мне,там я не требовал от вас кода

Добавлено через 1 час 25 минут
сейчас всё работает должным образом
всем спасибо,кто помогал мне справиться с моей проблемой
alsav22
5282 / 4801 / 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
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
11.08.2012, 23:31     Открытие файла #66
alsav22, код изврат... мешать не гуд
alsav22
11.08.2012, 23:59
  #67

Не по теме:

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

Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 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
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 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
5282 / 4801 / 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
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 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
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
12.08.2012, 01:21     Открытие файла #74
Все согласно исходному коду TC

Код
~/Рабочий стол/Linux,Проекты /g++/10$ ./main  //- запуск программы
1 - 1.txt    // вывод программы
Введите название файла
Максимум 28 символов
Рабочий стол/2.txt // я ввожу новый файл на добавление
Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Что означает непрозрачен.?
В использовании разных режимов записи и чтения.
seek() уже стрЁмно использовать для произвольного доступа к определенному пути.
alsav22
5282 / 4801 / 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;
}
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.08.2012, 03:28  [ТС]     Открытие файла #76
Цитата Сообщение от alsav22 Посмотреть сообщение
Только последняя запись остаётся в файле.
не соглашусь-всё работает так,как нужно
alsav22
12.08.2012, 03:34
  #77

Не по теме:

Цитата Сообщение от alexey31415 Посмотреть сообщение
не соглашусь-всё работает так,как нужно
Работает, и пускай работает. Может хоть вы мне объясните, что это за функция: access(), и почему у меня компилятор её не принимает. Я уже устал у Avazart об этом спрашивать.

Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
12.08.2012, 03:39     Открытие файла #78
Цитата Сообщение от alsav22 Посмотреть сообщение
Я уже устал у Avazart об этом спрашивать.
Прямого вопроса небыло.. Ранее с ней не имел дело, но думаю и так понятно что она проверяет доступность файла...
Вместо нее можно просто пробвать открыть файл для чтения ... и если неуспешно создавать его...
Цитата Сообщение от alsav22 Посмотреть сообщение
Только бинарное чтение-запись. Код
Открытие файла
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2012, 03:53     Открытие файла #79
Цитата Сообщение от Avazart Посмотреть сообщение
думаю и так понятно
Почему компилятор у меня её не принимает? Откуда она, вообще? Это функция С++?

Цитата Сообщение от Avazart Посмотреть сообщение
Вместо нее можно просто пробвать открыть файл для чтения ... и если неуспешно создавать его..
Я так и делаю.

Цитата Сообщение от Avazart Посмотреть сообщение
Открытие файла
Это к чему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 03:56     Открытие файла
Еще ссылки по теме:

Поиск и открытие файла! C++
C++ Открытие файла
C++ Открытие файла по команде

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
12.08.2012, 03:56     Открытие файла #80
Цитата Сообщение от alsav22 Посмотреть сообщение
Это к чему?
К тому что приводил подобный код ранее..
Yandex
Объявления
12.08.2012, 03:56     Открытие файла
Закрытая тема Создать тему
Опции темы

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