我有一個代碼,目標是使用fread讀取二進制檔案,然后處理資料并將其發送到大小為1310720的char *buffer
現在(使用我的作業代碼)我正在逐位元組讀取檔案以進行一些處理,然后將位元組 1 逐 1 寫入unsigned char array[i]
我正在使用這樣的東西
void read_input_file(FILE *stream,char *buffer)
{
long i = 0;
unsigned char tmp_buf[1310720] ;
unsigned char *calc = malloc(1);
while(i < 1310720)
{
fread(calc,1,1,stream);
tmp_buf[i] = round(*calc /128);//this is an example
i ;
}
memcpy(buffer, &tmp_buf[0], 1310720);
}
它正在作業,但現在我想(出于性能原因)讀取緩沖區大小的資料塊。所以我嘗試使用這樣的東西:
void read_input_file(FILE *stream,char *buffer)
{
long i = 0;
unsigned char tmp_buf[1310720] ;
unsigned char *calc = malloc(1310720);
fread(calc,1310720,1,stream);
while(i < 1310720)
{
tmp_buf[i] = round(calc[i] /128);//this is an example
i ;
}
memcpy(buffer, &tmp_buf[0], 1310720);
}
但無論我做什么,我都會在程式崩潰的地方遇到執行錯誤。我嘗試了很多不同的東西和代碼,但沒有任何效果。
那么如何將一大塊資料讀入緩沖區,然后逐位元組訪問以處理資料?
uj5u.com熱心網友回復:
既然你說你在Windows上作業,問題就是我在評論中概述的:
Windows 上的堆疊大小限制為 1024 KiB (1 MiB),您正在嘗試在堆疊上創建 1280 KiB 緩沖區。使用兩次動態記憶體分配。即使在類 Unix 系統上,堆疊大小限制通常為 8 MiB,因此在堆疊上分配這么大的陣列有點可疑。
因為您的tmp_buf變數是作為堆疊上的區域變數創建的,所以您在 Windows 上炸毀了堆疊。并作為
我認為您的函式應該回傳一個狀態以指示它是否成功,因此我將回傳型別更改為intand 用于0指示成功和-1失敗。
這意味著您的代碼需要變得更像:
enum { BUFFER_SIZE = 1310720 };
int read_input_file(FILE *stream, char *buffer)
{
long i = 0;
unsigned char *temp = malloc(BUFFER_SIZE);
unsigned char *calc = malloc(BUFFER_SIZE);
if (temp == NULL || calc == NULL)
{
free(temp); // Free both in case only one was allocated
free(calc);
return -1;
}
if (fread(calc, BUFFER_SIZE, 1, stream) != 1)
{
free(temp);
free(calc);
return -1;
}
for (size_t i = 0; i < BUFFER_SIZE; i )
{
temp[i] = round(calc[i] / 128); //this is an example
}
memcpy(buffer, temp, BUFFER_SIZE);
free(temp);
free(calc);
return 0;
}
buffer如果將長度傳遞給檢查函式,我會更高興,但這是您可以做出的決定。這不是關鍵。您還可以使用長度引數而不是固定大小(現在在列舉值中)來使您的代碼更通用。但是,您目前可能不需要這種通用性。
也不清楚您不能通過使用temp(aka tmp_buf) 取消:
calc[i] = round(calc[i] / 128.0);
注意轉換為浮點常量;否則,沒有什么可以舍入的,因為除法將是整數除法。但是,如果非示例計算使用的其他元素calc不僅僅是calc[i],那么您確實需要第二個陣列來保存結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519690.html
上一篇:如何用C中的函式更改字串值?
