Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.85
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
#1

Чтение из файла с конца - C++

22.05.2010, 12:50. Просмотров 6185. Ответов 6
Метки нет (Все метки)

Добрый день, не могу реализовать такую штуку =)
Хотелось бы имеющийся текстовый файл перезаписать с обратном порядке (все символы наоборот)
Понятно, что надо открыть файл на чтение и установить ук-ль на конец файла. А дальше...
Может циклом while читать посимвольно, но какое условие задать? =)
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
//------------------------------------------
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
const char * my_file = "My_file.txt";
int input_f();
//------------------------------------------
int main()
{
    input_f();
    return 0;
}
//------------------------------------------
int input_f()
{
    ifstream fin;
    fin.open(my_file, ios_base::in | ios_base::ate); //открыть файл для чтения и поместить указатель в конец файла
    if (!fin) cerr << "File not found!";
    
    
    fin.close();
    cout << "\ndone!";
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2010, 12:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файла с конца (C++):

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Чтение запросов до конца файла - C++
Доброго времени суток, Помогите начинающему...Имеется задача.Само условие говорить не буду(не суть).Проблема состоит в том,что от меня...

Чтение начиная с конца файла - C++
Всем добрый вечер! Программа создает самопальный класс список как в STL и пишет/ читает с файла Вот результат работы: . Считывать в...

Чтение до конца строки - C++
В файле лежит только одно слово, мне его надо считывать while по символьно, я никак не разберусь с условием вайла , while( !f.eof() ) не...

Чтение динамического массива с конца - C++
Можно ли каким-то образом считывать динамический массив не с начала,а с конца?

Cin, чтение с конца полученного потока - C++
Происходит ввод с клавиатуры последовательности чисел разделенных пробелами, нужно извлечь из этого потока последнее значение. Как?

6
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
22.05.2010, 13:20 #2
зачем себе так усложнять жизнь?
читаешь весь файл построчной fgets(массив, размер можно, указатель на файл) в двухмерный динамический массив.... потом каждую строку разворачиваешь char *strrev(char *s); и начиная с последней строки пишешь в новый файл.

C++
1
2
3
4
5
6
7
8
9
10
11
char **arr = new char *[количество строк]; //создаем 2хмерный массив
for(int i=0;i<количества_строк, i++)//создаем 2хмерный массив
{
arr[i]=new char [размер строки];//создаем 2хмерный массив
}
int i=0;
while(!feof(pfile))//читаем из файла...
{
fgets(arr[i],255,pfile);
i++;
}
если надо будет, вечером смогу подробнее написать.
PS количество строк можно узнать прогнав fgets в цикле с счетчиком до создания массива.
1
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
22.05.2010, 14:20  [ТС] #3
Комплируется нормально, работу прекращает во время выполнения, ошибка думаю происходит в fgets, как исправить не знаю.
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
//------------------------------------------
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h> 
#define MAXLIN 80
using namespace std;
const char * my_file = "My_file.txt";
//------------------------------------------
int main()
{
    FILE * f1;
    int n=0;
    char string [MAXLIN];
    if (0==(f1=fopen(my_file, "r"))) cerr << "File not found!"; //открытиена чтение
    while(fgets(string,MAXLIN,f1))  //счётчик строк в файле 
        n++;
    cout << n;
    //------------------------------------------
    char **arr = new char *[n]; //создаем 2хмерный массив
    //------------------------------------------
    for(int i=0;i<n;i++)//создаем 2хмерный массив
    {
        arr[i]=new char [MAXLIN];//создаем 2хмерный массив
    }
    //------------------------------------------
    int i=0;
    while(!feof(f1))//читаем из файла...
        {
            fgets(arr[i],MAXLIN,f1);
            i++;
        }
    //------------------------------------------
    //потом каждую строку разворачиваешь char *strrev(char *s); и начиная с последней строки пишешь в новый файл.
    for(int i=0;i<n;i++)
        arr[i]=strrev(arr[i]);
    //------------------------------------------
    for(int i=n;i!=0;i--)
        fputs(arr[i],f1);
    return 0;
}
//------------------------------------------
0
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
22.05.2010, 16:18 #4
после того как ты посчитал строки нужно закрыть указатель на файл, и открыть заново, т.к. там указатель стоит в конце файла...

Добавлено через 13 минут
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
#include <iostream>
#include <fstream>
#include <stdio.h> 
#define MAXLIN 80
using namespace std;
const char * my_file = "My_file.txt";
//------------------------------------------
int main()
{
        FILE * f1, *f2, *f3;
        int n=0;
        char string [MAXLIN];
        if (0==(f1=fopen(my_file, "r"))) cerr << "File not found!"; //открытиена чтение
        while(fgets(string,MAXLIN,f1))  //счётчик строк в файле 
                n++;
        cout << n;
        //------------------------------------------
        char **arr = new char *[n]; //создаем 2хмерный массив
        //------------------------------------------
        for(int i=0;i<n;i++)//создаем 2хмерный массив
        {
                arr[i]=new char [MAXLIN];//создаем 2хмерный массив
        }
        fclose(f1);
        //------------------------------------------
        if (0==(f2=fopen(my_file, "r"))) cerr << "File not found!";
        int i=0;
        while(!feof(f2))//читаем из файла...
                {
                        fgets(arr[i],MAXLIN,f2);
                        i++;
                }
        fclose(f2);
        //------------------------------------------
        //потом каждую строку разворачиваешь char *strrev(char *s); и начиная с последней строки пишешь в новый файл.
        if (0==(f3=fopen("new_file.txt", "w"))) cerr << "File not found!";
        for(int i=0;i<n;i++)
                arr[i]=strrev(arr[i]);
        //------------------------------------------
        for(int i=n-1;i>=0;i--)//т.к. нумерация в массиве с 0, то при i==0; должно выполняться, и из за того что нумерация с нуля... от количества строк отнимаем 1
                fputs(arr[i],f3);
        return 0;
}
1
oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
22.05.2010, 16:42  [ТС] #5
ААААА)))))))))) понял почему))) спасибо большое =)
п.с. тут сообщения удалять можно? оО
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
22.05.2010, 17:30 #6
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
#include <stdio.h>
#include <stdlib.h>
 
#define FILE_NAME "simple.txt"
 
int main(void){
    char * buf, * p;
    long len;
    FILE * f;
 
    if ( ( f = fopen(FILE_NAME, "rb") ) == NULL ){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    if ( fseek(f, 0, SEEK_END) ){
        perror("fseek");
        exit(EXIT_FAILURE);
    }
    if ( ( len = ftell(f)) < 1 ){
        fprintf(stderr, "File can't be readen, or empty.\n");
        exit(EXIT_FAILURE);
    }
    rewind(f);
 
    if ( ( buf = (char*)malloc(len) ) == NULL ){
        perror("malloc");
        if ( fclose(f) )
            perror("fclose");
        exit(EXIT_FAILURE);
    }
 
    if ( fread(buf, 1, len, f) != len ){
        perror("fread");
        if ( fclose(f) )
            perror("fclose");
        exit(EXIT_FAILURE);
    }
    if ( fclose(f) )
        perror("fclose");
 
    for ( p = buf + len - 1; p >= buf; --p )
        putchar(*p);
 
    free(buf);
    exit(EXIT_SUCCESS);
}
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.05.2010, 10:02 #7
Это все какие-то извращения
1) Определяем размер файла
2) Выделяем буфер
3) Читаем весь файл в память - одним read()
4) В памяти разворачиваем буфер

C
1
2
3
4
5
6
7
char *buf;
int buf_size;
char ch;
 
for ( i= 0, j= buf_size-1; i<j; i++, j-- ) {
    ch= buf[i]; buf[i]= buf[j]; buf[j]= ch;
}
5) Записываем в файл - одним write()
0
23.05.2010, 10:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 10:02
Привет! Вот еще темы с ответами:

Перебор файла посимвольно, как организовать цикл, работающий до конца файла. - C++
Нужно перебрать файл посимвольно и, учитывая спецсимволы записать содержимое файла в Memo1. Помогите пожалуйста организовать цикл...

Переделать в коде чтение из файла в чтение с клавиатуры - C++
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

Истинность конца файла - C++
Суть в чем. Есть реализация криптосистемы МакЭлисса. В входном текстовом файле считываются символы, символы разбиваются на биты, из...

Условие конца файла - C++
Имеем функцию: void Inpfile (stud&amp; s) { ifstream base(&quot;base.txt&quot;); if(!base)std::cout &lt;&lt; &quot;Can't create input file&quot;; ...


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

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

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