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

Вопрос по работе с файлами - C++

Восстановить пароль Регистрация
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.07.2010, 19:21     Вопрос по работе с файлами #1
Пока i-=2 не вставил, выводила пустую строку в результате. Почему так? Что за 2 знака перед eof() мешали?

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
int main(int argc, char* argv[])
{
    long i;
 
    fstream fio("reverse.txt", ios::in|ios::out|ios::binary);
 
    if (!fio)
    {
        cout<<"File openning error!\n";
        return 1;
    }
 
    char ch;
 
    for (ch = 'a'; ch <= 'z'; ch++)
        fio<<ch<<' ';
    
    fio.seekg(0,ios::end);
    
    i = (long) fio.tellg();
 
    i-=2;
 
    for(; i >= 0; i--)
    {
        fio.seekg(i, ios::beg);
        fio.get(ch);
        cout<<ch;
        //if (fio.eof()) continue;
    }
 
    cout<<endl;
 
    fio.close();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2010, 19:21     Вопрос по работе с файлами
Посмотрите здесь:

C++ Вопрос по работе с массивами
C++ Подскажите по работе с файлами
программа по работе с текстовыми файлами C++
C++ Маленький вопрос по работе с файлами
C++ Совет по работе с файлами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
20.07.2010, 19:54     Вопрос по работе с файлами #2
C++
1
        for(; i >= 0; i--)
а почему начального условия в цикле нет О.о
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.07.2010, 20:15  [ТС]     Вопрос по работе с файлами #3
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
C++
1
        for(; i >= 0; i--)
а почему начального условия в цикле нет О.о
Такое возможно , т.к. оно уже задано
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
20.07.2010, 21:55     Вопрос по работе с файлами #4

Не по теме:

Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а почему начального условия в цикле нет О.о
ну да...



Добавлено через 36 минут
Почему так?
Даже и не знаю... Есть одна идейка.
Есть два перегруженных метода seekg():
C++
1
2
3
4
5
6
7
basic_istream<Elem, Tr>& seekg(
    pos_type pos
);
basic_istream<Elem, Tr>& seekg(
    off_type off,
    ios_base::seekdir way
);
Ты используешь второй метод: seekg(off_type off, ios_base::seekdir way). Вот что по этому поводу говорит microsoft:
Do not use the second member function with text files, because Standard C++ does not support relative seeks in text files.
- т.е. не использовать вторую функцию-член с текстовыми файлами, потому что Standard C++ не поддерживает относительный поиск в текстовых файлах.

Добавлено через 53 минуты
Странно, в книжке у Эккеля используется относительный поиск в текстовых файлах...

Добавлено через 4 минуты
Кажется, я понял, что к чему. Курсор в потоках указывает на следующий элемент, который может быть прочитан. Т.е., после записи в цикле последнего символа (символ пробела), курсор указывает на позицию за этим символом. Значит, относительное смещение -1 от конца (или, как в данном случае, текущей позиции курсора) файла будет указывать на символ пробела, а смещение -1 на символ 'z'. Поэтому и нужна была эта запись:
C++
1
i-=2;
PS. Это все мои домыслы, могу и ошибаться

Добавлено через 1 минуту
Немного переделал твой пример, так чтобы от переменной i можно было избавиться:
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
#include <fstream>
#include <iostream>
#include <string>
 
int main()
{
    std::string filename("reverse.txt");
    std::fstream io(filename.c_str(), std::ios::in | std::ios::out | std::ios::trunc);
 
    if (!io)
    {
        std::cout << "Error opening file \"" << filename << "\"" << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }
 
    char ch;
 
    for (ch = 'a'; ch <= 'z'; ch++)
            io << ch << ' ';
    
    io.seekg(-2, std::ios::cur);
    do
    {
        io.get(ch);
        std::cout << ch;
        io.seekg(-2, std::ios::cur);
    }
    while(io.tellg() >= 0);
    std::cout << std::endl;
    system("pause");
    return EXIT_SUCCESS;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 22:17     Вопрос по работе с файлами #5
alexsvk, держи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
 
int main() {
  std::fstream stream("reverse.txt");
 
  for (char ch = 'a'; ch <= 'z'; ++ch)
    stream << ch <<' ';
 
  for (int pos = static_cast<int>(stream.tellg()) - 1; pos >= 0; --pos) {
    stream.seekg(pos);
    std::cout << static_cast<char>(stream.get());
  }
 
  std::cout << std::endl;
 
  return 0;
}
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.07.2010, 23:02  [ТС]     Вопрос по работе с файлами #6
Да, просто без i-=2 она не работала. Спасибо за примеры.
Yandex
Объявления
20.07.2010, 23:02     Вопрос по работе с файлами
Ответ Создать тему
Опции темы

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