Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 31.08.07 10:38
Оценка:
Здраствуйте.

bool Func(const char* str_val)
{
    fstream file("somefile");
    char str[50];
    bzero(str, sizeof(str));
    bool flag = false;
    
    while (!file.eof()) {            // Пока нету конца файла
        file.getline(str, 50);        // Считать строку 
        if (0 == strncmp(str_val, str, strlen(str_val)))    // сравнивает первое слово
            flag = true;                // совпало

    }
    return flag;
}


После вызова этой функции нужно переместить указатель в файле на начало файла. Как это сделать.
Re: Перемещение указателя на начало файла
От: Аноним  
Дата: 31.08.07 11:12
Оценка:
seekg
Re: Перемещение указателя на начало файла
От: carpenter Голландия  
Дата: 31.08.07 11:15
Оценка:
Здравствуйте, snedelko, Вы писали:


S> fstream file("somefile");



S>После вызова этой функции нужно переместить указатель в файле на начало файла. Как это сделать.


file::seekp(0);

только после вызова этой функции объекта file уже не будет
Весь мир — Кремль, а люди в нем — агенты
Re[2]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 31.08.07 15:22
Оценка:
C>только после вызова этой функции объекта file уже не будет
Да вроде есть, он же глобальный у меня

C>file::seekp(0);

не работает !!!
Re[3]: Перемещение указателя на начало файла
От: Максим2006 Беларусь  
Дата: 31.08.07 15:58
Оценка:
Здравствуйте, snedelko, Вы писали:

C>>только после вызова этой функции объекта file уже не будет

S>Да вроде есть, он же глобальный у меня
глобальный был бы такой (в .cpp-файле):
fstream file("somefile");

bool Func(const char* str_val)
{
    char str[50];
// ...



C>>file::seekp(0);

S>не работает !!!
покажите код
Re[4]: Перемещение указателя на начало файла
От: dotidot Россия  
Дата: 31.08.07 20:30
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>покажите код

повторяй: "я знаю как юзать гугль, я знаю как юзать гугль, ".
http://www.google.ru/search?q=seekg

первый результат:
http://www.cplusplus.com/reference/iostream/istream/seekg.html

там есть раздел Example
PS а еще почитай про seekp и вообще про c++ Standard Input / Output Streams Library. Можно на том же сайте, хотя там вроде только референс.
Re[4]: Перемещение указателя на начало файла
От: dotidot Россия  
Дата: 31.08.07 20:32
Оценка:
Здравствуйте, Максим2006, Вы писали:

ой
я, конечно, snedelko написал предыдущий пост
Re[2]: Перемещение указателя на начало файла
От: carpenter Голландия  
Дата: 01.09.07 07:16
Оценка:
Здравствуйте, carpenter, Вы писали:



C>file::seekp(0);

пардон ... seekg ... просто ассоциация была от setpos
Весь мир — Кремль, а люди в нем — агенты
Re[4]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 01.09.07 11:54
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Здравствуйте, snedelko, Вы писали:


М>покажите код


#ifndef LIKE_INI_H
#define LIKE_INI_H

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;


// Класс для работы с файлом настроек
// Особенности: 

class CIni
{
    private:
        fstream file;

        bool isFileExist(const char* fname){
            fstream fs(fname, ios_base::in);        // attempt open for read
            if (!fs) {
                                                    // file doesn't exist; don't create a new one
            } else     {                                 //ok, file exists. close and reopen in write mode
                fs.close();
              //    fs.open(“fname”, ios_base::out);    // reopen for write
            }
            return fs != NULL;
        };

        bool isExist(const char* str_val){
    
            char str[50];
            bzero(str, sizeof(str));
            bool flag = false;
    
            while (!file.eof()) {            // Пока нету конца файла
                file.getline(str, 50);        // Считать строку 
                if (0 == strncmp(str_val, str, strlen(str_val)))    // сравнивает первое слово
                    flag = true;                // совпало

            }
            return flag;
        };

        char buf[50];

    public:
        CIni(){
            if (isFileExist("/home/TEST.TEST")) {
                cerr << "file exist" << endl;
                file.open("/home/TEST.TEST", ios::in | ios::out | ios::binary /*| ios::trunc*/);
            } else {
                cerr << "file not exist" << endl;
                file.open("/home/TEST.TEST", ios::out | ios::binary /*| ios::trunc*/);
            }
        

            bzero(buf, sizeof(buf));
        };
        ~CIni(){
            if (file.is_open()) {
                file.close();
                cerr << "file closed" << endl;
            }

        };
        void Read(const char* str_val){
            if (!isExist(str_val)) {                // После функции isExist указатель сместился вниз
                cerr << "Read failure" << endl;
                return;
            }
            file.seekg(0, ios::begin);           // Тут пытаюсь вернуть его наверх
            char str[50];
            bool isOutLoop = false;

            while (!(file.eof() || isOutLoop)) {
                cerr << "iteration" << endl;
                file.getline(str,50);
                if (0 == strncmp(str_val, str, strlen(str_val))) {
                    file.getline(buf,50);
                    isOutLoop = true;
                    cerr << "buf = " << buf << endl;
                }
            
            }
        };
//        void Write();
};

#endif    // LIKE_INI_H
Re[5]: Перемещение указателя на начало файла
От: Максим2006 Беларусь  
Дата: 03.09.07 07:27
Оценка:
Здравствуйте, snedelko, Вы писали:

На самом деле, всё работает (см. коменты в коде).

S>
S>#ifndef LIKE_INI_H
S>#define LIKE_INI_H

S>#include <fstream>
S>#include <iostream>
S>#include <vector>

S>using namespace std;


S>// Класс для работы с файлом настроек
S>// Особенности: 

S>class CIni
S>{
S>    private:
S>        fstream file;

S>        bool isFileExist(const char* fname){
S>            fstream fs(fname, ios_base::in);        // attempt open for read
S>            if (!fs) {
S>                                                    // file doesn't exist; don't create a new one
S>            } else     {                                 //ok, file exists. close and reopen in write mode
S>                fs.close();
S>              //    fs.open(“fname”, ios_base::out);    // reopen for write
S>            }
S>            return fs != NULL;
S>        };

S>        bool isExist(const char* str_val){
    
S>            char str[50];
S>            bzero(str, sizeof(str));
S>            bool flag = false;
    
S>            while (!file.eof()) {            // Пока нету конца файла
S>                file.getline(str, 50);        // Считать строку 
S>                if (0 == strncmp(str_val, str, strlen(str_val)))    // сравнивает первое слово
S>                    flag = true;                // совпало

S>            }
S>            return flag;
S>        };

S>        char buf[50];

S>    public:
S>        CIni(){
S>            if (isFileExist("/home/TEST.TEST")) {
S>                cerr << "file exist" << endl;
S>                file.open("/home/TEST.TEST", ios::in | ios::out | ios::binary /*| ios::trunc*/);
S>            } else {
S>                cerr << "file not exist" << endl;
S>                file.open("/home/TEST.TEST", ios::out | ios::binary /*| ios::trunc*/);
S>            }
        

S>            bzero(buf, sizeof(buf));
S>        };
S>        ~CIni(){
S>            if (file.is_open()) {
S>                file.close();
S>                cerr << "file closed" << endl;
S>            }

S>        };
S>        void Read(const char* str_val){
S>            if (!isExist(str_val)) {                // После функции isExist указатель сместился вниз
                                                                // а точнее - в конец файла, то есть file.eof() == true
S>                cerr << "Read failure" << endl;
S>                return;
S>            }
S>            file.seekg(0, ios::begin);           // Тут пытаюсь вернуть его наверх
                                                             // нету ios::begin, есть ios::beg
S>            char str[50];
S>            bool isOutLoop = false;

S>            while (!(file.eof() || isOutLoop)) { // условие цикла не выполняется
S>                cerr << "iteration" << endl;
S>                file.getline(str,50);
S>                if (0 == strncmp(str_val, str, strlen(str_val))) {
S>                    file.getline(buf,50);
S>                    isOutLoop = true;
S>                    cerr << "buf = " << buf << endl;
S>                }
            
S>            }
S>        };
S>//        void Write();
S>};

S>#endif    // LIKE_INI_H


S>
Re[6]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 03.09.07 08:01
Оценка:
Здравствуйте, Максим2006, Вы писали:

М> нету ios::begin, есть ios::beg


Сорри, когда переносил код сюда напортачил, но дело не в этом все равно. Я читал что после того, как указатель дойдет до eof, объект fstream равен 0. Может из-за этого не работает? Тупо отключаю функцию isExist и все работает..
Re[7]: Перемещение указателя на начало файла
От: Максим2006 Беларусь  
Дата: 03.09.07 09:14
Оценка:
Здравствуйте, snedelko, Вы писали:

S>Здравствуйте, Максим2006, Вы писали:


М>> нету ios::begin, есть ios::beg


S>Сорри, когда переносил код сюда напортачил, но дело не в этом все равно. Я читал что после того, как указатель дойдет до eof, объект fstream равен 0. Может из-за этого не работает? Тупо отключаю функцию isExist и все работает..


Да, из-за этого и не работает. Я указывал это в коменте.
Можно тупо не доходить до конца файла в isExist, а делать break при первой встрече искомой строчки.
Если всё же пришлось пройти весь файл, то есть возможность скинуть eofbit с помощью функции clear()
Re[8]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 03.09.07 10:01
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Если всё же пришлось пройти весь файл, то есть возможность скинуть eofbit с помощью функции clear()


Тоже не помогло. Похоже с объектом fstream невозможно нормально работать после того как eofbit установлен. Пришлось написать чтото типа reopen().....
Re[9]: Перемещение указателя на начало файла
От: Максим2006 Беларусь  
Дата: 03.09.07 10:18
Оценка:
Здравствуйте, snedelko, Вы писали:

S>Здравствуйте, Максим2006, Вы писали:


М>>Если всё же пришлось пройти весь файл, то есть возможность скинуть eofbit с помощью функции clear()


S>Тоже не помогло. Похоже с объектом fstream невозможно нормально работать после того как eofbit установлен. Пришлось написать чтото типа reopen().....

Всем помогает, а вам нет... покажите минимальный код, где не работает.

Как вариант, можно работать с файлом на стеке, а не через член класса.
Re[10]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 03.09.07 11:50
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Всем помогает, а вам нет... покажите минимальный код, где не работает.


bool CIni::isExist(const char* str_val)
{
    
    char str[50];
    bzero(str, sizeof(str));
    bool flag = false;
    
    while (!file.eof()) {            // Пока нету конца файла
        file.getline(str, 50);        // Считать строку 
        if (0 == strncmp(str_val, str, strlen(str_val)))    // сравнивает первое слово
            flag = true;                // совпало

    }
    if (file.eof()) {
        cerr << "eof cleared" << endl;
        file.clear(ios::eofbit); // этого нехватает для работы "как надо"
    //    ReOpen();          // эта строчка делает то, что мне надо
    }
    return flag;
}

void CIni::ReOpen()
{
    if (file.is_open()) {
        cerr << "closed in ReOpen()" << endl;
        file.close();
    }
    file.open("/home/TEST.TEST", ios::in | ios::out | ios::binary /*| ios::trunc*/);
}
Re[11]: Перемещение указателя на начало файла
От: Максим2006 Беларусь  
Дата: 03.09.07 12:10
Оценка:
Здравствуйте, snedelko, Вы писали:

S>
S>        file.clear(ios::eofbit); // этого нехватает для работы "как надо"
S>


А вы в хелп пробовали смотреть?

Clears all error flags.
 
void clear(
   iostate _State=goodbit
);

Parameters
_State (optional) 
The flags you want to set after clearing all flags.
Re[12]: Перемещение указателя на начало файла
От: snedelko Украина  
Дата: 03.09.07 13:19
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>А вы в хелп пробовали смотреть?

Две страницы ответов на и все нормально зароботало после:

file.clear(); // сбрасывает биты ошибок
file.seekg(0, ios::beg); // устанавливает указатель в начало

Спасибо за соучастие
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.