CS50 recover,什么时候用buffer和&buffer?
CS50 recover, when to use buffer and &buffer?
我解决了 CS50 中的 pset4 恢复问题。尽管我解决了问题,但我还是混淆了“buffer”和“&buffer”。请关注“LINE AAAAA”和“LINE BBBBB”。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// New type to store a byte of data
typedef uint8_t BYTE;
// Number of "block size" 512
const int BLOCK_SIZE = 512;
int main(int argc, char *argv[])
{
// Check for 2 command-line arguments
if (argc != 2)
{
printf("Usage: ./recover IMAGE\n");
return 1;
}
// Open card.raw file
FILE *input = fopen(argv[1],"r");
// Check for fail to open
if (input == NULL)
{
printf("Couldn't open the file.\n");
return 1;
}
// Read the first 4 bytes
BYTE buffer[BLOCK_SIZE];
// Count image
int count_image = 0;
// Assign NULL to output_file
FILE *output = NULL;
// Declare filename
char filename[8];
// LINE AAAAA
while (fread(buffer, sizeof(BYTE), BLOCK_SIZE, input) == BLOCK_SIZE)
{
// Check first 4 bytes for JPEG file format
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
// Only for first image, generate new filename and write into it
if (count_image == 0)
{
// Generate a new file with sequence name
sprintf(filename, "%03i.jpg", count_image);
// Open new file
output = fopen(filename, "w");
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
// Add filename counter
count_image++;
}
// For subsequence new repeat JPG images
// Close output file, generate new file, and write into it
else if (count_image > 0)
{
// fclose current writing files
fclose (output);
// Generate a new file with sequence name
sprintf(filename, "%03i.jpg", count_image);
// Open new file
output = fopen(filename, "w");
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
// Add filename counter
count_image++;
}
}
// Not fulfill the 4 bytes JPG condition, keep writing to the same filename
else if (count_image > 0)
{
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
}
}
fclose(output);
fclose(input);
}
问题:
为什么我们在 LINE BBBBB 中使用“&buffer”而不是“buffer”?
我知道 LINE AAAAA 正在使用“缓冲区”,因为 BYTE 缓冲区[BLOCK_SIZE] 是一个指针或数组。所以“缓冲区”表示指针的位置。
fwrite(buffer, ...) 可以正常工作。
使用buffer
时,往往会转换为第一个元素的地址。 &buffer
是数组的地址。
这 2 个地址比较相等,但类型不同。当类型很重要时,请使用匹配的类型。启用所有警告以帮助识别不正确的类型用法。
由于 fread()
使用 void *
,两者都可以。
在这种情况下概念上使用 buffer
来匹配 sizeof(BYTE)
和 BLOCK_SIZE
。
或
fread(&buffer, sizeof buffer, 1, input) == 1)
我解决了 CS50 中的 pset4 恢复问题。尽管我解决了问题,但我还是混淆了“buffer”和“&buffer”。请关注“LINE AAAAA”和“LINE BBBBB”。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// New type to store a byte of data
typedef uint8_t BYTE;
// Number of "block size" 512
const int BLOCK_SIZE = 512;
int main(int argc, char *argv[])
{
// Check for 2 command-line arguments
if (argc != 2)
{
printf("Usage: ./recover IMAGE\n");
return 1;
}
// Open card.raw file
FILE *input = fopen(argv[1],"r");
// Check for fail to open
if (input == NULL)
{
printf("Couldn't open the file.\n");
return 1;
}
// Read the first 4 bytes
BYTE buffer[BLOCK_SIZE];
// Count image
int count_image = 0;
// Assign NULL to output_file
FILE *output = NULL;
// Declare filename
char filename[8];
// LINE AAAAA
while (fread(buffer, sizeof(BYTE), BLOCK_SIZE, input) == BLOCK_SIZE)
{
// Check first 4 bytes for JPEG file format
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
// Only for first image, generate new filename and write into it
if (count_image == 0)
{
// Generate a new file with sequence name
sprintf(filename, "%03i.jpg", count_image);
// Open new file
output = fopen(filename, "w");
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
// Add filename counter
count_image++;
}
// For subsequence new repeat JPG images
// Close output file, generate new file, and write into it
else if (count_image > 0)
{
// fclose current writing files
fclose (output);
// Generate a new file with sequence name
sprintf(filename, "%03i.jpg", count_image);
// Open new file
output = fopen(filename, "w");
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
// Add filename counter
count_image++;
}
}
// Not fulfill the 4 bytes JPG condition, keep writing to the same filename
else if (count_image > 0)
{
// LINE BBBBB
fwrite (&buffer, sizeof(BYTE), BLOCK_SIZE, output);
}
}
fclose(output);
fclose(input);
}
问题: 为什么我们在 LINE BBBBB 中使用“&buffer”而不是“buffer”?
我知道 LINE AAAAA 正在使用“缓冲区”,因为 BYTE 缓冲区[BLOCK_SIZE] 是一个指针或数组。所以“缓冲区”表示指针的位置。
fwrite(buffer, ...) 可以正常工作。
使用buffer
时,往往会转换为第一个元素的地址。 &buffer
是数组的地址。
这 2 个地址比较相等,但类型不同。当类型很重要时,请使用匹配的类型。启用所有警告以帮助识别不正确的类型用法。
由于 fread()
使用 void *
,两者都可以。
在这种情况下概念上使用 buffer
来匹配 sizeof(BYTE)
和 BLOCK_SIZE
。
或
fread(&buffer, sizeof buffer, 1, input) == 1)