В паскале (да и не только) данные в типизированном файле (в вашем случае — file of integer
) хранятся в шестнадцатиричном виде. В паскале integer занимал 2 байта, именно поэтому выскочила ошибка «Чтение после конца потока невозможно», ведь «8» — это один байт.
Если вы хотите читать целые числа из текстового файла, используйте TextFile (или Text в олдскульном варианте). Для freepascal, pascalABC.NET и Delphi это будет так:
var
a : integer;
f : TextFile;
begin
AssignFile(f, 'f.txt');
Reset(f);
//Seek(f, 0);
Read(f, a); // a = 8, хотя лучше читать сразу всю строку, используя несколько переменных
<...>
CloseFile(f);
end.
А в варианте для Turbo Pascal и самых первых версий Delphi — так:
var
a : integer;
f : Text;
begin
Assign(f, 'f.txt');
Reset(f);
//Seek(f, 0);
Read(f, a); { a = 8 поскольку в Turbo Pascal // не было комментарием :) }
<...>
Close(f);
end.
G1gg13s 0 / 0 / 0 Регистрация: 30.01.2016 Сообщений: 21 |
||||
1 |
||||
Ошибка времени выполнения: Чтение после конца потока невозможно28.02.2016, 21:32. Показов 10873. Ответов 5 Метки нет (Все метки)
Ошибка в строке 9.
0 |
318 / 208 / 162 Регистрация: 08.12.2015 Сообщений: 863 |
|
28.02.2016, 23:29 |
2 |
Вы пытаетесь из текстового файла прочитать как из файла с переменными. Это несколько неверно. seek тоже даст далее ошибку. Так-же , в 17 и 19 строках тоже будет ошибка, пытаетесь записать в тот же файл, не открыв его на запись. В общем, задание неизвестно ,как исправить — непонятно. 0 |
0 / 0 / 0 Регистрация: 30.01.2016 Сообщений: 21 |
|
29.02.2016, 20:37 [ТС] |
3 |
Есть текстовый файл с текстом ‘123456’ и нужно заменить 3 и и 5 элементы. 0 |
Почетный модератор 64289 / 47588 / 32739 Регистрация: 18.05.2008 Сообщений: 115,181 |
|
29.02.2016, 20:49 |
4 |
РешениеА как создан файл А, он точно типизированный? 1 |
0 / 0 / 0 Регистрация: 30.01.2016 Сообщений: 21 |
|
29.02.2016, 20:50 [ТС] |
5 |
Я — е*лан, сори. Я понял, люблю тебя :*, пусик 0 |
Puporev Почетный модератор 64289 / 47588 / 32739 Регистрация: 18.05.2008 Сообщений: 115,181 |
||||
29.02.2016, 20:53 |
6 |
|||
Решение А зачем у него расширение да еще и txt? Как Вы его создавали?
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
29.02.2016, 20:53 |
Помогаю со студенческими работами здесь Чтение после конца потока невозможно С чем связана ошибка:»Чтение после конца потока невозможно» Подпрограмма выдает ошибку времени выполнения: Чтение после конца потока невозможно Чтение чисел из файла. Чтение после конца потока невозможно Чтение после конца потока невозможно Uses Crt; Чтение после конца потока невозможно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
В паскале (да и не только) данные в типизированном файле (в вашем случае — file of integer
) хранятся в шестнадцатиричном виде. В паскале integer занимал 2 байта, именно поэтому выскочила ошибка «Чтение после конца потока невозможно», ведь «8» — это один байт.
Если вы хотите читать целые числа из текстового файла, используйте TextFile (или Text в олдскульном варианте). Для freepascal, pascalABC.NET и Delphi это будет так:
var
a : integer;
f : TextFile;
begin
AssignFile(f, 'f.txt');
Reset(f);
//Seek(f, 0);
Read(f, a); // a = 8, хотя лучше читать сразу всю строку, используя несколько переменных
<...>
CloseFile(f);
end.
А в варианте для Turbo Pascal и самых первых версий Delphi — так:
var
a : integer;
f : Text;
begin
Assign(f, 'f.txt');
Reset(f);
//Seek(f, 0);
Read(f, a); { a = 8 поскольку в Turbo Pascal // не было комментарием :) }
<...>
Close(f);
end.
type base = record n1, n2: string[15]; tel: string[4]; d, m: byte; y: integer; end; var r: base; a: array [1..10] of base; f: file of base; i: integer; begin assign(f, 'in.dat'); rewrite(f); // создаем новый файл for i := 1 to 10 do // заполняем его 10 значениями "от балды", чтобы был понятен принцип begin r.d := i; r.m := i; r.y := i; // тут тестовые значения r.n1 := 'start'; r.n2 := 'finish'; r.tel := '3234'; write(f, r); // пишем структуру в файл end; close(f); reset(f); // переоткрываем файл уже для чтения i := 0; while not eof(f) do // и читаем содержимое в массив a begin inc(i); read(f, a[i]); // в этой строке не показывает никакой ошибки end; close(f); end.
Приветствую, мне требуется ваша помощь, уже не знаю, что делать, весь интернет перерыл, и всем помогает Position = 0,а мне нет.
private static byte[] buffer = new byte[1024];
private static MemoryStream stream = new MemoryStream(buffer);
private static BinaryWriter writer = new BinaryWriter(stream);
private static BinaryReader reader = new BinaryReader(stream);
private List<string> listCode = new List<string>();
void ReceiveData()
{
int bytes = 0;
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
listCode.Clear();
do
{
bytes = socket.ReceiveFrom(buffer, ref remoteIp);
}
while (socket.Available > 0);
bool getData = true;
stream.Position = 0;
try
{
while (getData)
{
string data = reader.ReadString(); // ВОТ ТУТ КОД ВЫДАЕТ ИСКЛЮЧЕНИЕ ПОСЛЕ ТОГО КАК ДАННЫЕ С СЕРВЕРА ПРИХОДЯТ 2-ОЙ РАЗ
if (data != "")
listCode.Add(data);
else
getData = false;
}
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
stream.SetLength(0);
stream.Position = 0;
IPEndPoint remoteFullIP = remoteIp as IPEndPoint;
}
Подскажите пожалуйста! Всем спасибо!
Всем доброго времени суток, столкнулся с проблемой
Чтения после конца потока невозможно
Дело в том что я читаю бинарный файл :
while (reader2.PeekChar() > -1)
{
numb2 = reader2.ReadInt32();
Int32 ndef2 = reader2.ReadInt32();
BitVector32 bv2 = new BitVector32(ndef);
int nr2 = bv2[nr_s];
y2 = bv2[y_s];
int sm2 = bv2[sm_s];
ds2 = bv2[d_s];
ms2 = bv2[m_s];
int rs2 = bv2[r_s];
}
И так получилось что numb2
имеет запись в файле поэтому reader2.PeekChar() > -1
больше 1, но вот ndef2
уже нету в файле, и я получаю ошибку чтения после конца потока, может есть более правильный метод инициализации данных в файле, и если дальше записи нет, то просто передать 0 и перейти дальше, либо пропускать и идти дальше, просто не хотелось бы делать что-то вроде:
while (reader2.PeekChar() > -1)
{
numb2 = reader2.ReadInt32();
if (reader2.PeekChar() > -1){
Int32 ndef2 = reader2.ReadInt32();
BitVector32 bv2 = new BitVector32(ndef);
int nr2 = bv2[nr_s];
y2 = bv2[y_s];
int sm2 = bv2[sm_s];
ds2 = bv2[d_s];
ms2 = bv2[m_s];
int rs2 = bv2[r_s];
}
}
Или все же придется ставить еще одну проверку, как я написал выше ?
Помогите пожалуйста разобраться.
type base = record n1, n2: string[15]; tel: string[4]; d, m: byte; y: integer; end; var r: base; a: array [1..10] of base; f: file of base; i: integer; begin assign(f, 'in.dat'); rewrite(f); // создаем новый файл for i := 1 to 10 do // заполняем его 10 значениями "от балды", чтобы был понятен принцип begin r.d := i; r.m := i; r.y := i; // тут тестовые значения r.n1 := 'start'; r.n2 := 'finish'; r.tel := '3234'; write(f, r); // пишем структуру в файл end; close(f); reset(f); // переоткрываем файл уже для чтения i := 0; while not eof(f) do // и читаем содержимое в массив a begin inc(i); read(f, a[i]); // в этой строке не показывает никакой ошибки end; close(f); end.
Приветствую, мне требуется ваша помощь, уже не знаю, что делать, весь интернет перерыл, и всем помогает Position = 0,а мне нет.
private static byte[] buffer = new byte[1024];
private static MemoryStream stream = new MemoryStream(buffer);
private static BinaryWriter writer = new BinaryWriter(stream);
private static BinaryReader reader = new BinaryReader(stream);
private List<string> listCode = new List<string>();
void ReceiveData()
{
int bytes = 0;
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
listCode.Clear();
do
{
bytes = socket.ReceiveFrom(buffer, ref remoteIp);
}
while (socket.Available > 0);
bool getData = true;
stream.Position = 0;
try
{
while (getData)
{
string data = reader.ReadString(); // ВОТ ТУТ КОД ВЫДАЕТ ИСКЛЮЧЕНИЕ ПОСЛЕ ТОГО КАК ДАННЫЕ С СЕРВЕРА ПРИХОДЯТ 2-ОЙ РАЗ
if (data != "")
listCode.Add(data);
else
getData = false;
}
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
stream.SetLength(0);
stream.Position = 0;
IPEndPoint remoteFullIP = remoteIp as IPEndPoint;
}
Подскажите пожалуйста! Всем спасибо!
Ошибка времени выполнения чтение после конца потока невозможно
На чтение 4 мин Опубликовано Обновлено
Ошибка «чтение после конца потока невозможно» возникает во время выполнения программы, когда происходит попытка прочитать данные из потока, который уже достиг конца. Такая ситуация может возникнуть, например, при чтении данных из файла или взаимодействии с сетью.
Проблема может возникнуть из-за неправильной работы с потоками ввода-вывода. Возможны несколько вариантов решения этой ошибки. Во-первых, стоит проверить, достигнут ли конец потока, прежде чем читать данные из него. Это можно сделать с помощью соответствующих методов, таких как feof для файла или isEOF для потока ввода-вывода в языке программирования Python.
Еще одним вариантом решения проблемы может быть использование исключений. Если после чтения данных из потока будет выброшено исключение, это может сигнализировать о достижении конца потока. В таком случае, можно использовать блок try-catch для перехвата и обработки исключения.
Также следует убедиться, что данные не читаются более одного раза после достижения конца потока. Если вы уже прочитали все данные из потока, а затем пытаетесь прочитать еще раз, это приведет к ошибке. Поэтому необходимо следить за тем, чтобы чтение данных происходило только до достижения конца потока.
Итак, чтобы избежать ошибки «чтение после конца потока невозможно», необходимо правильно работать с потоками ввода-вывода, проверять достижение конца потока перед чтением данных и обрабатывать исключения, которые могут возникнуть при чтении данных. Это позволит избежать неприятных ситуаций при выполнении программы и обеспечит ее более плавное выполнение.
Ошибки времени выполнения: причины и решения
Ошибки времени выполнения возникают, когда программа обнаруживает некорректное поведение или ограничения во время выполнения. Такие ошибки могут быть вызваны различными причинами:
- Неправильные данные: Одной из основных причин ошибок времени выполнения являются неправильные или некорректные данные, передаваемые программе. Если программа не может обработать эти данные, она может выдать ошибку.
- Нехватка ресурсов: Отсутствие необходимых ресурсов, таких как память, диск или сетевое соединение, может вызывать ошибки времени выполнения. Программа может пытаться обратиться к ресурсу, который недоступен, что приводит к ошибке.
- Неправильное использование API: Использование неправильных или устаревших версий API может вызвать ошибки времени выполнения. Некорректные вызовы API или неправильное использование их функций могут привести к неожиданным результатам и ошибкам.
- Недостаточная проверка ошибок: Если программа не выполняет достаточную проверку ошибок, она может не смочь обработать некорректные ситуации и выбросить исключение.
Чтобы решить ошибки времени выполнения, необходимо:
- Анализировать причину ошибки: Используйте отладчик или журналы ошибок, чтобы выяснить, что именно вызывает ошибку. Просмотрите код и убедитесь, что все данные и ресурсы используются правильным образом.
- Проверить входные данные: Убедитесь, что программа получает корректные и правильно отформатированные данные. Если входные данные некорректны, выполните проверку и сделайте необходимые изменения.
- Управление ресурсами: Удостоверьтесь, что программе доступны все необходимые ресурсы, такие как память, диск и сетевое соединение. Если ресурс недоступен, выполните необходимые действия для его восстановления или предупреждения пользователя.
- Обрабатывать ошибки: Добавьте обработку ошибок в код программы, чтобы она могла корректно реагировать на некорректные ситуации. Используйте конструкции try-catch, чтобы перехватывать и обрабатывать исключения.
При правильной анализе и обработке ошибок времени выполнения можно улучшить надежность и стабильность программы, а также предупредить непредвиденные сбои и ошибки.
Решение ошибки времени выполнения: чтение после конца потока
Ошибка времени выполнения «чтение после конца потока невозможно» возникает, когда программа пытается читать данные из потока после того, как он был закрыт или достиг конца. Эта ошибка может возникнуть, например, при выполнении операции чтения файла, чтении данных с сервера или из другого источника.
Для решения ошибки времени выполнения «чтение после конца потока невозможно» вам следует принять следующие меры:
- Убедитесь, что поток открыт и доступен для чтения. Проверьте, что файл существует, сервер доступен и т.д.
- Проверьте текущую позицию чтения в потоке. Убедитесь, что вы находитесь внутри потока и не пытаетесь прочитать за пределами его.
- Убедитесь, что вы правильно используете методы чтения потока. Некоторые методы могут возвращать специальные значения, указывающие на конец потока или ошибку чтения. Используйте эти значения для обработки ситуации, когда данные закончились или возникла ошибка.
- Проверьте, что поток закрыт после окончания операций чтения. Закрытие потока поможет избежать дальнейших попыток его чтения и предотвратит возникновение ошибки.
- Обработайте исключения, которые могут возникнуть во время операций чтения. Исключения, такие как IOException или EndOfStreamException, могут указывать на проблемы с доступом к данным или ошибки чтения.
Следуя этим рекомендациям, вы сможете предотвратить ошибку времени выполнения «чтение после конца потока невозможно» и обработать ее ситуацию корректно в своей программе.