Перемещение указателя на начало файла
От:
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: Перемещение указателя на начало файла
Здравствуйте, 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]: Перемещение указателя на начало файла
Здравствуйте, 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, Вы писали:
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]: Перемещение указателя на начало файла
Здравствуйте, 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]: Перемещение указателя на начало файла
Здравствуйте, 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]: Перемещение указателя на начало файла
Здравствуйте, 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]: Перемещение указателя на начало файла
Здравствуйте, 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); // устанавливает указатель в начало
Спасибо за соучастие
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить