LINUX.ORG.RU

Как прочитать N байт, но не больше M?

 


1

1

Читаю файл по частям, из за ограниченного объема памяти. При этом, чтение происходит где то с середины и может считываться от 0 до дохренища байт. Вот код:

#define BUFF_SIZE 512
uint16_t code_size, code_read = 0;
fread(&code_size, sizeof(uint16_t), 1, f);

while (code_read < code_size) {
	uint8_t buf[BUFF_SIZE];
	uint16_t tmp = fread(buf, 1, code_size % BUFF_SIZE, f);
	fwrite(buf, tmp, 1, f_sec_code);
	code_read += tmp;
}

code_off += code_size;
В данный момент программа зависает, не дочитав до конца (до code_size). Голова уже не варит, подскажите как реализовать.

Deleted

code_read видимо переполняется, зачем fread/fwrite когда есть read/write, проверяй коды ошибок

quest ★★★★
()
#define CHUNK 512
char buf[CHUNK];
FILE *file;
size_t nread;

if (file = fopen("test.txt", "r")) 
{
    while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
    {
        fwrite(buf, 1, nread, stdout);
    }
    fclose(file);
}

Просто нужно чуть больше ООП. Даже в таком говне мамонта как С

anonymous
()

что скажет Царь?

int13h ★★★★★
()
Ответ на: комментарий от MyTrooName

Да. Я вчера ночью это писал, так что хз как это вышло.

Deleted
()
Ответ на: комментарий от anonymous

Кстати, не то, что мне нужно. Здесь нет же ограничения на прочтенное количество байт. А мне оно нужно.

Deleted
()
Ответ на: комментарий от false

А блин, сори, я о них забыл. Спасибо, попробую переделать.

Deleted
()
Ответ на: комментарий от Deleted

Он в память «отображается». Т.е. файл представляется, как буд-то он в памяти, а на самом деле всё на диске.

А вот так, как ты сейчас пытаешься — оно как раз транжирит память, т.к. оно туда именно что «загружается» с диска.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Блин, я не так понял его назначение. Спасибо, попробую.

Deleted
()

uint16_t

На таких вещах лучше память не экономить, это ведь всё равно не массив.

anonymous
()

fread(buf, 1, code_size % BUFF_SIZE, f);

code_size % BUFF_SIZE

?!

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

Винда — это грустно, но аналог есть: http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx

Ладно, это была просто идея, как правильно решить твою проблему. Её конечно можно решать и по другому, но я бы всё же разобрался.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

code_read += tmp;

это к чему? а если функция 0 вернёт (в случае ошибки) цикл и зависнет, как раз.

next_time ★★★★★
()
Ответ на: комментарий от next_time

code_size % BUFF_SIZE <-- если code_size == 0 или BUFF_SIZE * n программа опять зависнет и вообще это выражение неверно.

#define BUFF_SIZE 512
uint16_t code_size, code_read = 0;
fread(&code_size, sizeof(uint16_t), 1, f);
uint8_t buf[BUFF_SIZE];

while (code_read < code_size - code_size % BUFF_SIZE) {
	
	uint16_t tmp = fread(buf, 1, BUFF_SIZE, f);
	fwrite(buf, tmp, 1, f_sec_code);
	code_read += BUFF_SIZE;
}

uint16_t tmp = fread(buf, 1, code_size % BUFF_SIZE, f);
fwrite(buf, tmp, 1, f_sec_code);

code_off += code_size;

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.