С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131

Чтение файла в строку char *

22.11.2017, 03:02. Показов 7589. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача состоит в том, чтобы считать последние 65536 байт файла в char *(без символа конца файла), и все вроде бы работает, но когда я вывожу в консоль считанные данные, то в конце лишние рандомные символы всегда. В чем я ошибся? Как их убрать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
errno_t err; // Нужно для безопасной работы с файлами
 
        FILE *pFile; // Переменная с файлом
        err = fopen_s(&pFile, filename, "rb"); // Открываем файл на чтение
 
        long long nFileLen = 0; // Длина файла
        long long offset = 0; // метка, куда нужно будет переместить указатель в файле.
        long long postfix = 65536; // кол-во считываемых байт.
        char * buffer;
 
        fseek(pFile, 0, SEEK_END);
        nFileLen = ftell(pFile);
        if ((nFileLen - 65536) < 0) postfix = nFileLen; // Если файл меньше 64 кб, то устанавливаем кол-во байт для смещения = размеру файла.
        offset = nFileLen - postfix;
        fseek(pFile, offset, SEEK_SET); // Перемещаем указать файла на нужное нам значение с начала файла.
        buffer = (char*)malloc(sizeof(char) * postfix); // Задаем длину переменной, в которой будет хранится инфа.
        fread(buffer, 1, nFileLen, pFile);
        fclose(pFile);
Над комментариями не смеяться, я их для себя писал)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2017, 03:02
Ответы с готовыми решениями:

Чтение из файла в массив char
Доброе время суток господа. У меня есть массив char a=&quot;I am text&quot; кпримеру, сама программа для работы с массивом написана. Но мне надо...

Чтение из файла и запись в массив char
Здравствуйте форумчане. Столкнулся с незнанием языка. У меня есть поток, который читает файл. Как мне этот потом записать в массив ? ...

Чтение текстового файла в вектор типа char
Имеется текстовый файл. Необходимо прочитать его ПОЛНОСТЬЮ, включая все символы переноса строки (и 0A и 0D), все пробелы, нулевые символы...

12
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
22.11.2017, 03:13
\0 в конце строки нету. буфер же читался не как текстовая строка, а значит ноль в конец ему не добавляли
0
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2017, 03:44  [ТС]
тем не менее, в конце лишние символы при выводе, которых нету в файле.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
22.11.2017, 03:46
шо "тем не менее"? Ты ноль в конец строки добавил?
0
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2017, 03:58  [ТС]
Вопрос не в нуле, а в том, как исправить то, что при чтении файла, в котором записано только "123456" выводится "123456⌂╚╚☺"(или что-то подобное, символы каждый раз случайные)
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
22.11.2017, 04:02
allCrowley, Я тебе назвал причину, по которой выводятся лишние символы. Эта причина - нет нуля. На всякий случай напишу: нет, не об "1234560" этом нуле!
0
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2017, 05:07  [ТС]

Не по теме:

На C++ у меня нет никакого опыта и 0 написанных программ(исключая Hello worl'ы различные). До этого я писал на C#, в котором таких проблем отродясь не было, язык простой, понятный и без заморочек.

0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.11.2017, 05:25
Лучший ответ Сообщение было отмечено allCrowley как решение

Решение

Выдели память на один байт больше, чем размер данных в файле. После чтения файла, помести по индексу, равному размеру данных в файле, символ '\0' (признак конца Си-строки).
1
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2017, 20:09  [ТС]
Как это можно сделать, применительно к моему методу? Я видимо не догоняю.
Сделал вот так:
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
char * FileRead(char *filename)
    {
        errno_t err; // Нужно для безопасной работы с файлами
 
        FILE *pFile; // Переменная с файлом
        err = fopen_s(&pFile, filename, "rb"); // Открываем файл на чтение
 
        long long nFileLen = 0; // Длина файла
        long long offset = 0;
        long long postfix = 65536;
        char * buffer;
 
        fseek(pFile, 0, SEEK_END);
        nFileLen = ftell(pFile);
        if ((nFileLen - 65536) < 0) postfix = nFileLen; // Если файл меньше 64 кб, то устанавливаем кол-во байт для смещения = размеру файла.
        offset = nFileLen - postfix;
        fseek(pFile, offset, SEEK_SET); // Перемещаем указать файла на нужное нам значение с начала файла.
        buffer = (char*)malloc(sizeof(char) * postfix)+1; // Задаем длину переменной, в которой будет хранится инфа.
        fread(buffer, 1, nFileLen, pFile);
        int len = strlen(buffer);
        buffer[len-1] = '\0';
        fclose(pFile);
 
        return buffer;
    }
Ну, то есть я в строке
C++
1
buffer = (char*)malloc(sizeof(char) * postfix)+1;
поставил +1, а в строке
C++
1
buffer[len-1] = '\0';
на последний символ записал нулевой байт.
Предполагалось что-то в этом роде: допустим, файл весит 10 байт. В таком случае функция
C++
1
(char*)malloc(sizeof(char) * postfix);
Вернет 10. Добавляем к этому +1 и получаем 11. В первые 10(от 0 до 9) читается файл, а в buffer[(11-1)] запишется '\0', но выполнение этого кода заканчивается исключением.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
22.11.2017, 20:13
Цитата Сообщение от allCrowley Посмотреть сообщение
buffer = (char*)malloc(sizeof(char) * postfix)+1;
неправильно, не туда +1 поставил.
Н-Е-П-Р-А-В-И-Л-Ь-Н-О!!!
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.11.2017, 20:29
Цитата Сообщение от allCrowley Посмотреть сообщение
C++
1
buffer = (char*)malloc(sizeof(char) * postfix)+1; // Задаем длину переменной, в которой будет хранится инфа.
Скобки поставь, чтобы не указатель увеличивался, а размер выделяемой памяти.
Цитата Сообщение от allCrowley Посмотреть сообщение
C++
1
fread(buffer, 1, nFileLen, pFile);
Размер памяти один выделяешь, а читаешь другой размер данных?
Цитата Сообщение от allCrowley Посмотреть сообщение
C++
1
int len = strlen(buffer);
strlen() требуется '\0' в конце Си-строки, чтобы определить количество символов в строке.

Добавлено через 11 минут
Вот тебе пример, дальше сам разбирайся:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    ifstream fin ("input.txt", ios::binary);
    if (fin)
    {
        fin.seekg(0, fin.end);
        size_t n = fin.tellg();
        char* buff = new char[n + 1];
        fin.seekg(0, fin.beg);
        fin.read(buff, n);
        buff[n] = '\0';
        cout << buff << endl;
    }
    else
        cout << "Error opening file!" << endl;
1
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2017, 23:02  [ТС]
Разобрался, спасибо
В итоге метод выглядит как-то так(на случай, если этот вопрос загуглит такой же дурачок как я в будущем):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char * Read(char *filename)
    {
        char * buffer;
        errno_t err; 
        long long nFileLen = 0;
        FILE *pFile;
        err = fopen_s(&pFile, filename, "rb");
        fseek(pFile, 0, SEEK_END);
        nFileLen = ftell(pFile);
        buffer = ((char*)malloc(sizeof(char) * nFileLen))+1;
        fseek(pFile, 0, SEEK_SET);
        fread(buffer, 1, nFileLen, pFile);
        fclose(pFile);
        buffer[nFileLen] = '\0';
        return buffer;
    }
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.11.2017, 23:42
Цитата Сообщение от allCrowley Посмотреть сообщение
C++
1
buffer = ((char*)malloc(sizeof(char) * nFileLen))+1;
Опять не так, опять к указателю единицу прибавляешь. При освобождении памяти ошибка будет.
C++
1
buffer = (char*)malloc(nFileLen + 1);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2017, 23:42
Помогаю со студенческими работами здесь

Чтение бинарного файла функцией std::ifstream::read(char*, streamsize)
Не могу нормально считать текст в бинарном режиме с помощью функции read(char*, streamsize). Файл file.txt имеет следующие символы:...

Как считать строку из файла в char?
Всем привет! Считать строку из файла в string - не проблема. Функцию getline() и погнали. Но мне нужно загнать данные в массив char. Как...

Запись символов из файла в единичный char и строку
Всем привет, учусь получать данные из файла и нашёл такое явление: если у нас есть такой код: ifstream gt(&quot;test.ini&quot;); ...

Чтение из файла в строку
Всем привет! Подскажите, пожалуйста, как прочитать весь текст из файла в переменную string! что-то туплю, не могу понять.. спасибо!

Считать с файла строку типа char до знака окончания строки
Всем доброго времени суток. Мне нужно считать с файла строку типа char до знака окончания строки ( '\0'). Как мне это сделать? Я...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru