Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
1

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

20.07.2010, 19:21. Просмотров 588. Ответов 5
Метки нет (Все метки)

Пока 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2010, 19:21
Ответы с готовыми решениями:

Маленький вопрос по работе с файлами
очень глупый к тому же) есть FILE * f=fopen(filename,&quot;r&quot;); FILE* F; как...

Вопрос по работе с файлами в Visual Studio
Написал программу для работы с файлом в Visual Studio. Iostream подключил. Но...

Подскажите по работе с файлами
struct MyStruct { char * Nam; unsigned int Salary; }; MyStruct emp;...

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

Задание по работе с файлами
Для двух файлов A и B, которые включают по 20 элементов :A = ({a}_{i}),B =...

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

Не по теме:

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



Добавлено через 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;
}
1
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 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;
}
1
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
20.07.2010, 23:02  [ТС] 6
Да, просто без i-=2 она не работала. Спасибо за примеры.
0
20.07.2010, 23:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2010, 23:02

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

Вопрос по работе с массивами
Уважаемые! Пишу программу на Си разбиения текста на страницы, возник вопрос...

Проблемы при работе с файлами
доброго времени! возник у меня маленький трабл при работе с файлами. Причем...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru