Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
1

Открытие файла

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

Author24 — интернет-сервис помощи студентам
У меня есть файл в котором сначала хранится количество наименований файлов,а потом названия файлов
пример
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)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2012, 20:05
Ответы с готовыми решениями:

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в...

Открытие файла
Здравствуйте, как сделать так чтобы допустим файл proga.exe открывалась на разных компьютерах, так...

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

Открытие файла
Необходимо открыть файл имя которого заранее не известно, если я ввожу input.txt то всё работает и...

92
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 01:13  [ТС] 21
Author24 — интернет-сервис помощи студентам
у меня в файле будут названия файла с различной длиной
я могу после каждого слова делать переход на следующую строку,а вот как мне найти эти переходы
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.08.2012, 01:20 22
Да не нужны никакие переходы в бинарнике...
Отводи под путь допустим 256 символов ( ну или сколько там MAX_PATH )
C++
1
char path[256];
И читай себе каждый раз 256*sizeof(char) байт за раз из файла
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 04:16  [ТС] 23
в принципе вариант,хоть и не самый рациональный
всё равно спасибо всем кто отписался

Добавлено через 2 часа 50 минут
Вот моя нынешняя функция,проблема возникает при записи названия в файл
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
#include "StdAfx.h"
 
#define MAX_PATH    32
#define COUNT_OF_FILES  32
 
int CountOfFiles = 0;
 
int main()
{
    setlocale(0,"");
 
    fstream data;
    char **NameOfFiles = new char*[COUNT_OF_FILES];
    /*vector<char *> NameOfFiles;*/
 
    if(access("info.txt", 0) == -1)
    {
        data.open("info.txt",ios::out | ios::binary);
 
        data.write(reinterpret_cast<const char *>(&CountOfFiles),sizeof(CountOfFiles));
        data.close();
        data.clear();
 
        cout << "Файлов ещё нет!" << endl;
    }
    else
    {
 
        data.open("info.txt",ios::in | ios::binary);
 
        data.seekg(0);
        data.read(reinterpret_cast<char *>(&CountOfFiles),sizeof(CountOfFiles));
 
        data.seekg(4);
        for(int i = 0;i < CountOfFiles;i++)
            data.read(NameOfFiles[i],sizeof(char *));
 
        data.close();
        data.clear();
    }
        
 
    if(CountOfFiles)
        {
                for(int i = 0;i < CountOfFiles;i++)
                cout << i+1 << " - " << NameOfFiles[i] << endl;
 
                /*cout << "Выберите файл" << endl;*/
 
                /*cin >> NumberOfFile;*/
        }
 
    cout << "Введите название файла" << endl
    << "Максимум 28 символов" << endl;
 
    string Temp;
 
    cin >> Temp;
    Temp += ".txt";
 
    if(Temp.size() < 32)
    {
    CountOfFiles++;
 
    const char *name = Temp.data();
    NameOfFiles[CountOfFiles] = new char[MAX_PATH];
 
    strncpy(NameOfFiles[CountOfFiles],name,Temp.size());
    NameOfFiles[CountOfFiles][Temp.size()] = '\0';
 
    data.open("info.txt",ios::out | ios::binary);
 
    if(data)
    cout << "open" << endl;
 
    data.write(reinterpret_cast<const char *>(&CountOfFiles),sizeof(CountOfFiles));
    cout << "write CountOfFiles" << endl;
    
    for(size_t i = 0;i < CountOfFiles;i++)
        data.write(NameOfFiles[i],sizeof(char *));//вот здесь вылетает ошибка
 
    data.close();
    data.clear();
    }
    else
        cout << "Можно ввести максимум 28 символов" << endl;
 
    system("pause");
 
    return 0;
}
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 04:51 24
Я совершенно не пойму что делает программа, может и правда стоит произвести очень четкое разграничение, что делать при записи файлов, а что при чтении. Или по крайней мере в отдельную функцию запихнуть с осмысленным названием.
По 80 строке у меня есть подозрение, что синтаксис функции write() таков write( char * customString, long lenOfCustomString)
http://www.cplusplus.com/refer... eam/write/
А вы зачем-то передаёте ей размер указателя на char
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 05:09  [ТС] 25
даже,если сделаю так,то всё равно результат тот же
C++
1
data.write(NameOfFiles[i],sizeof(NameOfFiles[i]));
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 05:16 26
alexey31415, а вы попробуйте во втором параметре strlen(NameOfFiles[i])
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 05:21  [ТС] 27
согласен ошибка глупая,не заметил в спешке,но всё равно проблема та же
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 05:24 28
Тогда не знаю. Попробуйте отладочную информацию выводить или даже сразу отладчиком пользоваться, а можно и то и другое
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 05:26  [ТС] 29
я и так отладчиком пользуюсь,вылетает ошибка необработанное исключение в ... и идёт адрес блока памяти
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 05:30 30
А можно чисто ради интереса дать этот самый пример входного файла. И что там за заголовки в stdafx?
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 05:36  [ТС] 31
в коде предусмотрен вариант когда файла ещё нет,он создаётся,туда записываётся 0(кол-во названий),потом я ввожу название и он записывает название,предварительно записав новое кол-во файлов(1)
вот поэтому файла нет

Добавлено через 3 минуты
ах да,почему-то не записываются данные при создании файла(если он не был создан)
должен быть записан 0,а там пусто
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 05:42 32
Ну так как ясень пень, что здесь нулевой элемент никогда не будет инициализрован
C++
1
2
3
4
CountOfFiles++;
 
      const char *name = Temp.data();
      NameOfFiles[CountOfFiles] = new char[MAX_PATH];
1
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 05:44  [ТС] 33
Цитата Сообщение от Buckstabue Посмотреть сообщение
И что там за заголовки в stdafx?
файлы стандартной библиотеки С++
файл выглядеть должен примерно так
2//это кол-во названий файлов
1.txt//сами названия
2.txt
и так далее
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.08.2012, 12:55 34
Пример сразу с seek() http://www.cplusplus.com/refer... eam/write/
0
alexey31415
10.08.2012, 13:51  [ТС]
  #35

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Пример сразу с seek()
огромный пример

0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
10.08.2012, 22:01 36
Ошибку, что я привёл, исправили хотя бы?
Зачем вообще эти seek? Может стоит просто тупо считать весь файл в какой-нибудь список файлов? Все равно при записи в начало файла необходимо считать его в оперативную память, изменить начало строки и только потом производить запись. А считывать построчно при помощи банального std::getline(fstream, filename). Вон, зайди в папку system32, там тысячи файлов, но проводник ведь не вылетает из-за нехватки памяти.
Можно ещё, как вариант, зарезервировать первые 10 байт под хранение кол-файлов, и если в середине файла ничего не менялось, то тупо переписывать именно первые 10 байт, в которых указывать новое кол-во файлов. Этот алгоритм можно также распространить и для файлов в середине списка, но это не стоит того, имхо
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 22:35  [ТС] 37
Цитата Сообщение от Buckstabue Посмотреть сообщение
нулевой элемент никогда не будет инициализрован
согласен,еще одна моя ошибка
теперь данные записываются,спасибо,но я выделяю для каждого названия массив из 32 байтов,а названия могут быть и короче,поэтому когда я открываю созданный файл,то выводится следующее
Миниатюры
Открытие файла  
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.08.2012, 22:39 38
Может стоит просто тупо считать весь файл в какой-нибудь список файлов?
Я об этом уже говорил...

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

Добавлено через 1 минуту
открываю созданный файл,то выводится следующее
Ну так ты не правильно в строки заполнял...
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
10.08.2012, 23:24  [ТС] 39
Цитата Сообщение от Avazart Посмотреть сообщение
Только я не понял из задания нудно добавлять в начало файла или перезаписывать?
я сейчас всё перезаписываю
вот собственно функция
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
#define MAX_PATH    32
#define COUNT_OF_FILES  32
 
int CountOfFiles = 0;
 
int main()
{
    setlocale(0,"");
 
    fstream data;
    char **NameOfFiles = new char*[COUNT_OF_FILES];
 
    //если файл ещё не существует
    if(access("info.txt", 0) == -1)
    {
        data.open("info.txt",ios::out | ios::binary);
 
        data.write(reinterpret_cast<const char *>(&CountOfFiles),sizeof(CountOfFiles));
        data.close();
        data.clear();
 
        cout << "Файлов ещё нет!" << endl;
    }
    else
    {
 
        data.open("info.txt",ios::in | ios::binary);
 
        data.seekg(0);
        data.read(reinterpret_cast<char *>(&CountOfFiles),sizeof(CountOfFiles));
 
        //после того как записали кол-во файлов
        //пермещаемся на 4-ый байт и выделяем память для названий
        data.seekg(4);
        for(int i = 0;i < CountOfFiles;i++)
        {
            NameOfFiles[i] = new char[MAX_PATH];//
            data.read(NameOfFiles[i],sizeof(NameOfFiles[i]));//
        }
 
        data.close();
        data.clear();
    }
        
 
    if(CountOfFiles)
        {
                for(int i = 0;i < CountOfFiles;i++)
                cout << i+1 << " - " << NameOfFiles[i] << endl;
        }
 
    cout << "Введите название файла" << endl
    << "Максимум 28 символов" << endl;
 
    string Temp;
 
    cin >> Temp;
    Temp += ".txt";
 
    if(Temp.size() < 32)
    {
    const char *name = Temp.data();
    NameOfFiles[CountOfFiles] = new char[MAX_PATH];
 
    //копируем название нового файла
    strncpy(NameOfFiles[CountOfFiles],name,Temp.size());
    NameOfFiles[CountOfFiles][Temp.size()] = '\0';
 
    data.open("info.txt",ios::out | ios::binary);
 
    if(data)
    cout << "open" << endl;
 
    //записываем сначала новое кол-во файлов
    CountOfFiles++;
    data.write(reinterpret_cast<const char *>(&CountOfFiles),sizeof(CountOfFiles));
    cout << "write CountOfFiles" << endl;
    
    //пишем сами названия
    for(size_t i = 0;i < CountOfFiles;i++)
        data.write(NameOfFiles[i],strlen(NameOfFiles[i]));
 
    data.close();
    data.clear();
    }
    else
        cout << "Можно ввести максимум 28 символов" << endl;
 
    //освобождаем ресурсы
    for(int i = 0;i < CountOfFiles;i++)
        delete []NameOfFiles[i];
 
    delete []NameOfFiles;
 
    system("pause");
 
    return 0;
}
Добавлено через 34 минуты
в 81 строке
C++
1
data.write(NameOfFiles[i],32);
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.08.2012, 00:22 40
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
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <iterator>
//-------------------------------------------------------------------------------------------
int main(int argc, char **argv)
{
using namespace std;    
    
vector<string> vs;  
        
vs.push_back("/home/2/Рабочий стол/Linux,Проекты /");
vs.push_back("/home/Рабочий стол/Linux,Проекты /");
vs.push_back("/home/Рабочий стол/");
 
//----------- записываем ---------------
ofstream ofs("1.txt");
 
if(ofs) 
 {
  for(size_t i=0; i<vs.size(); i++) 
   {
    char ch[256];
    strcpy(ch,vs[i].c_str() );   
    ofs.write(ch,256* sizeof(char) );
   }
   ofs.close();
 }  
else cerr<<"error1"<<endl;
  
vs.clear();
 
//----------- читаем ---------------
ifstream ifs("1.txt");
if(ifs) 
 {
  char ch[256];
  while( ifs.read(ch,256* sizeof(char) ) )
   {
    vs.push_back(ch);
   }
   ifs.close();
 }  
else cerr<<"error2"<<endl;
 
//----------- выводим ---------------
copy(vs.begin(),vs.end(),ostream_iterator<string>(cout,"\n") ) ;
 
return 0;
}
//-------------------------------------------------------------------------------------------
1
11.08.2012, 00:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2012, 00:22
Помогаю со студенческими работами здесь

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

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

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

Открытие файла
Как открыть файл при помощи кода с++, чтобы файл открылся так как открывается при обычном 2х щелчке...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru