提问人:Nicholas Picklas 提问时间:6/22/2023 更新时间:6/22/2023 访问量:63
在 C 语言中,写入 ~2gb 以上的文件不会停止
Writing doesn't stop for files above ~2gb in C
问:
我有一些 C 代码,应该生成密码并将其保存到文件中。我试图输入一个大约 10 GB 的长度(大得离谱,但我想看看它能以多快的速度做到这一点),它并没有停留在 10 GB。
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(){
int i = 0;
char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-+={[]}\\|;:'\",<.>/?`~!@#$^&*()";
long long size;
char keypath[512];
char password;
printf("Where should the key be saved? ");
fgets(keypath, sizeof(keypath), stdin);
keypath[strcspn(keypath, "\n")] = 0;
printf("How long should the key be? ");
scanf("%lli",&size);
getchar();
srand((unsigned int)(time(NULL)));
FILE* fptr = fopen(keypath,"a");
if (fptr == NULL) {
printf("Failed to open file for writing\n");
return 1;
}
for (i = 0; i < size; i++){
int choice = rand() % strlen(chars);
password = chars[choice];
fprintf(fptr, "%c", chars[choice]);
}
fclose(fptr);
return 0;
}
似乎当它超过 1 gib 时(我假设是 2 gib,因为这是使用前的常规数量),它不会停止写入,而是看似无限期地继续。#define _FILE_OFFSET_BITS 64
我正在使用 Raspbian。
非常感谢任何帮助。
答:
4赞
Andreas Wenzel
6/22/2023
#1
最好将变量设置为 类型 ,这样可以保证它能够表示 10 GB 的文件大小。size
long long
但是,您忘记对变量 .相反,您给出了数据类型 。i
i
int
因此,循环
for (i = 0; i < size; i++){
int choice = rand() % strlen(chars);
password = chars[choice];
fprintf(fptr, "%c", chars[choice]);
}
由于有符号整数溢出,将调用未定义的行为,除非您碰巧位于能够表示文件大小为 10 GB 的平台上。在大多数常见的 PC 平台上,INT_MAX
(可以表示的最大值)的值为 。在这些平台上,an 无法表示值 。int
int
2147483647
int
10000000000
评论
int
int i = 0;
long long i = 0;