在 C 中存储和解包一个非常长的整数数组
Storing and unpacking a very long array of ints in C
我有一个非常长的整数数组 (3,000,000+),我想存储它们并能够快速解压。起初,我将每个 int 写在一个文本文件中的单独一行中,但是由于必须将字符串转换回 int,因此解压缩花费了相当长的时间。然后,有人建议我只将数组本身写入文件,但是当我读回它并打印出元素时,它只打印零。代码看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 3000000
int main() {
FILE *f = fopen("file.txt", "w");
int *arr = malloc(LENGTH * sizeof(int));
/* initialization of arr not shown */
fwrite(arr, sizeof(int), LENGTH, f);
fclose(f);
free(arr);
return 0;
}
然后解压数据:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 3000000
int main() {
FILE *f = fopen("file.txt", "r");
int *arr = malloc(LENGTH * sizeof(int));
fread(arr, sizeof(int), LENGTH, f);
fclose(f);
for (int i = 0; i < LENGTH; ++i) {
printf("%d\n", arr[i]);
}
free(arr);
return 0;
}
但是,正如我所说,它只打印零。为什么这不起作用,有没有更合适的方法来做这样的事情?
几件事:
直接读写int
时,也必须以b
模式打开文件:
// Open for writing
FILE *fp = fopen("myfile.bin", "wb");
// Open for reading:
FILE *fp = fopen("myfile.bin", "rb");
调用 malloc
时,您应该 始终 检查 return 值是否不是 NULL
以确保分配成功。分配 3000000 * sizeof(int)
字节时,不检查是否成功是一场等待发生的灾难。您还应该检查 fopen
、fread
和 fwrite
:
的 return 值
// Checking malloc for success
arr = malloc(LENGTH * sizeof(int));
if(NULL == arr)
{
perror("malloc");
exit(EXIT_FAILURE);
}
// Checking fopen for success:
FILE *fp = fopen("file.bin", "rb");
if(NULL == fp)
{
perror("fopen");
exit(EXIT_FAILURE);
}
// Checking fread for success:
size_t readCnt = fread(arr, sizeof(int), LENGTH, fp);
if(readCnt != LENGTH)
{
// Did not read file successfully
}
// Checking fwrite for success:
size_t writtenCnt = fwrite(arr, sizeof(int), LENGTH, fp);
if(writtenCnt != LENGTH)
{
// Did not write file successfully
}
我有一个非常长的整数数组 (3,000,000+),我想存储它们并能够快速解压。起初,我将每个 int 写在一个文本文件中的单独一行中,但是由于必须将字符串转换回 int,因此解压缩花费了相当长的时间。然后,有人建议我只将数组本身写入文件,但是当我读回它并打印出元素时,它只打印零。代码看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 3000000
int main() {
FILE *f = fopen("file.txt", "w");
int *arr = malloc(LENGTH * sizeof(int));
/* initialization of arr not shown */
fwrite(arr, sizeof(int), LENGTH, f);
fclose(f);
free(arr);
return 0;
}
然后解压数据:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 3000000
int main() {
FILE *f = fopen("file.txt", "r");
int *arr = malloc(LENGTH * sizeof(int));
fread(arr, sizeof(int), LENGTH, f);
fclose(f);
for (int i = 0; i < LENGTH; ++i) {
printf("%d\n", arr[i]);
}
free(arr);
return 0;
}
但是,正如我所说,它只打印零。为什么这不起作用,有没有更合适的方法来做这样的事情?
几件事:
直接读写
int
时,也必须以b
模式打开文件:// Open for writing FILE *fp = fopen("myfile.bin", "wb"); // Open for reading: FILE *fp = fopen("myfile.bin", "rb");
调用
的 return 值malloc
时,您应该 始终 检查 return 值是否不是NULL
以确保分配成功。分配3000000 * sizeof(int)
字节时,不检查是否成功是一场等待发生的灾难。您还应该检查fopen
、fread
和fwrite
:// Checking malloc for success arr = malloc(LENGTH * sizeof(int)); if(NULL == arr) { perror("malloc"); exit(EXIT_FAILURE); } // Checking fopen for success: FILE *fp = fopen("file.bin", "rb"); if(NULL == fp) { perror("fopen"); exit(EXIT_FAILURE); } // Checking fread for success: size_t readCnt = fread(arr, sizeof(int), LENGTH, fp); if(readCnt != LENGTH) { // Did not read file successfully } // Checking fwrite for success: size_t writtenCnt = fwrite(arr, sizeof(int), LENGTH, fp); if(writtenCnt != LENGTH) { // Did not write file successfully }