6 / 6 / 0
Регистрация: 20.06.2012
Сообщений: 33
1

Функция считывания из текстового файла

20.06.2012, 21:27. Показов 1229. Ответов 4
Метки нет (Все метки)

Здравствуйте, написал функцию, работает некорректно, может слишком долго работаю, но не вижу в чем проблема. Заранее спасибо за помощь. Вот код:

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
int LoadTextFile(char * data, char const * const filename){
    long size;
    FILE* file;
    /* File opening */
    file = fopen(filename, "r");
    if(NULL == file)
        return FILE_OPEN_ERROR;
    /* Getting chars number */
    rewind(file);
    if(0 != fseek(file, 0, SEEK_END)){
        if(EOF == fclose(file))
            return FILE_CLOSE_ERROR;
        return FILE_READ_ERROR;
    }
    size = ftell(file);
    if(-1 == size){
        if(EOF == fclose(file))
            return FILE_CLOSE_ERROR;
        return FILE_READ_ERROR;
    }else if(0 == size){
        if(EOF == fclose(file))
            return FILE_CLOSE_ERROR;
        return FILE_EMPTY_ERROR;
    }
    rewind(file);
    /* Heap-memory allocating */
    data = (char*)malloc(sizeof(char) * (size + 1));
    if(NULL == data){
        if(EOF == fclose(file))
            return FILE_CLOSE_ERROR;
        return MEM_ALLOC_ERROR;
    }
    /* File reading */
    if(size != fread(data, sizeof(char), size, file)){
        if(EOF == fclose(file))
            return FILE_CLOSE_ERROR;
        free(data);
        return FILE_READ_ERROR;
    }
    data[size] = '\0';
    /* File closing */
    rewind(file);
    if(EOF == fclose(file))
        return FILE_CLOSE_ERROR;
    return NO_ERROR;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2012, 21:27
Ответы с готовыми решениями:

Написать программу для считывания содержимого текстового файла
1 написать программу для считывания содержимого текстового файла. 2 Написать программу для...

Функция считывания слов с текстового файла
Доброго времени суток!) Задача такова: Считать из текстового файла слова в массив (создать для...

Сохранение и считывания списка с текстового файла
Всем привет! Ребята я делаю программу по работе со списками и она уже почти готова, по сути всё...

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

4
Эксперт С++
5038 / 2617 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.06.2012, 10:28 2
Цитата Сообщение от NateChad Посмотреть сообщение
работает некорректно
Что значит некорректно? Какие данные в файле находятся? Подробнее, пожалуйста.
0
6 / 6 / 0
Регистрация: 20.06.2012
Сообщений: 33
21.06.2012, 11:46  [ТС] 3
Цитата Сообщение от fasked Посмотреть сообщение
Что значит некорректно? Какие данные в файле находятся? Подробнее, пожалуйста.
Обычный текстовый файл.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11707 / 7214 / 1710
Регистрация: 25.07.2009
Сообщений: 13,216
22.06.2012, 02:47 4
Не заморачиваясь тем, что файл лучше читать блоками по BUFSIZ, а функции fseek, ftell устанавливают глобальную переменную errno, то есть можно подробнее узнать, что там за беда приключилась...
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
int file2str(const char * sFileName, char ** pBuf) {
    FILE * pFile;
    long nLength;
    
    if ( ! sFileName || ! pBuf )
        return EINVAL;
    
    if ( ! ( pFile = fopen(sFileName, "rb") ) )
        return ENOENT;
    
    if ( fseek(pFile, 0, SEEK_END) ) {
        if ( fclose(pFile) )
            perror("fclose");
        return EIO;
    }
    
    if ( ( nLength = ftell(pFile) ) < 0 ) {
        if ( fclose(pFile) )
            perror("fclose");
        return EIO;
    }
    rewind(pFile);
    
    if ( ! ( *pBuf = malloc(nLength + 1) ) ) {
        if ( fclose(pFile) )
            perror("fclose");
        return ENOMEM;
    }
    
    if ( fread(*pBuf, sizeof(char), nLength, pFile) != nLength ) {
        if ( fclose(pFile) )
            perror("fclose");
        return EIO;
    }
    (*pBuf)[nLength] = '\0';
    
    if ( fclose(pFile) )
        return ETXTBSY;
    
    return 0;
}
 
#define FILE_NAME "file.txt"
 
int main(void) {
    char * buf;
    int ret;
    
    switch ( ( ret = file2str(FILE_NAME, &buf) ) ) {
        case EINVAL :
            fprintf(stderr, "Invalid arguments!\n");
            break;
        case ENOENT :
            fprintf(stderr, "Can't open file %s for input!\n", FILE_NAME);
            break;
        case EIO :
            fprintf(stderr, "Error while reading input file!\n");
            break;
        case ENOMEM :
            fprintf(stderr, "Memory error!\n");
            break;
        case ETXTBSY :
            fprintf(stderr, "Can't properly close input file. Content may be corrupt!\n");
        default :
            printf("Content of %s:\n\n%s\n", FILE_NAME, buf);
            free(buf);
            break;
    }
    
    exit(ret);
}
0
6 / 6 / 0
Регистрация: 20.06.2012
Сообщений: 33
22.06.2012, 03:08  [ТС] 5
Я понял. Ошибка в том, что выделяя память я затирал указатель на переменную. Решение сделать указатель на указатель
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2012, 03:08
Помогаю со студенческими работами здесь

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

Ошибка времени выполнения: Попытка считывания за концом текстового файла
program ya_ustal; var f:text;m,l:string; a,b,c:integer; begin b:=0; m:='D:\input.txt';...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru