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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.85
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
22.05.2010, 12:50     Чтение из файла с конца #1
Добрый день, не могу реализовать такую штуку =)
Хотелось бы имеющийся текстовый файл перезаписать с обратном порядке (все символы наоборот)
Понятно, что надо открыть файл на чтение и установить ук-ль на конец файла. А дальше...
Может циклом 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 в цикле с счетчиком до создания массива.
oinari
 Аватар для 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;
}
//------------------------------------------
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;
}
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
22.05.2010, 16:42  [ТС]     Чтение из файла с конца #5
ААААА)))))))))) понял почему))) спасибо большое =)
п.с. тут сообщения удалять можно? оО
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 10:02     Чтение из файла с конца
Еще ссылки по теме:

Чтение динамического массива с конца C++
Чтение файла с несколькими знаками конца файла C++
Чтение запросов до конца файла C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
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()
Yandex
Объявления
23.05.2010, 10:02     Чтение из файла с конца
Ответ Создать тему
Опции темы

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