gpt4 book ai didi

c - 在 C 文件中读取和写入(加倍)

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:42 26 4
gpt4 key购买 nike

我正在尝试读取一个文件,读取它包含的字节数,然后将其四舍五入到最接近的 GB,然后将文件大小加倍。但是,有没有办法读取文件,然后将所有这些东西重新放入同一个文件中?

这是我目前所拥有的,但它创建了一个包含新内容的新文件,但我不确定我的逻辑是否正确

此外,您是否使用#define 创建一个像 BYTE 这样的常量?

就测试用例而言,我只是将 byte 用作 int 并使其等于 50

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>

// #define BYTE 50

int main()
{
FILE *fp1, *fp2;
int ch1;
clock_t elapsed;
char fname1[40], fname2[40];
char a;

printf("Enter name of the file:");
fgets(fname1, 40, stdin);
while ( fname1[strlen(fname1) - 1] == '\n')
{
fname1[strlen(fname1) -1] = '\0';
}

fp1 = fopen(fname1, "r");
if ( fp1 == NULL )
{
printf("Cannot open %s for reading\n", fname1 );
exit(1);
}

printf("This program will round up the current file into highest GB, and then double it");

elapsed = clock(); // get starting time

ch1 = getc(fp1); // read a value from each file

int num = 50;

int bytes = 0;

while(1) // keep reading while values are equal or not equal; only end if it reaches the end of one of the files
{
ch1 = getc(fp1);

bytes++;

if (ch1 == EOF) // if either file reaches the end, then its over!
{
break; // if either value is EOF
}
}

// 1,000,000,000 bytes in a GB
int nextInt = bytes%num;

// example: 2.0GB 2,000,000,000 - 1.3GB 1,300,000,000 = 7,000,000,000 OR same thing as 2,000,000,000%1,300,000,000 = 700,000,000

int counter = 0;

printf("Enter name of the file you would like to create:");
fgets(fname2, 40, stdin);
while ( fname2[strlen(fname2) - 1] == '\n')
{
fname2[strlen(fname2) -1] = '\0';
}

fp2 = fopen(fname2, "w");
if ( fp1 == NULL )
{
printf("Cannot open %s for reading\n", fname2);
exit(1);
}

if(fp2 == NULL)
{
puts("Not able to open this file");
fclose(fp1);
exit(1);
}

while(counter != nextInt)
{
a = fgetc(fp1);
fputc(a, fp2);
counter++;
}

fclose(fp1); // close files
fclose(fp2);

printf("Total number of bytes in the file %u: ", bytes);
printf("Round up the next GB %d: ", nextInt);

elapsed = clock() - elapsed; // elapsed time
printf("That took %.4f seconds\n", (float)elapsed/CLOCKS_PER_SEC);
return 0;
}

最佳答案

您在检查 EOF 之前递增了 bytes,因此出现了差一错误。

但是,逐字节读取文件是一种查找文件大小的缓慢方法。使用标准 C,您可以使用 ftell() — 如果您使用的是 64 位类 Unix 机器。否则,您工作的值太接近适合 32 位值的值。对 bytes 使用普通的 int 会遇到麻烦。

或者,更好的是,您可以使用 stat()fstat() 直接获取准确的大小。

当涉及到将文件大小加倍时,您可以简单地寻找新的结束位置并在该位置写入一个字节。但是,这并没有分配所有的磁盘空间(在 Unix 机器上);它将是一个稀疏文件。

在重写时,您需要知道您的系统将如何处理单个文件上的两个打开的文件流。在类 Unix 系统上,您可以打开原始文件一次用于读取,一次用于以附加模式写入。然后,您可以一次从读取文件描述符读取大块(64 KiB,256 KiB?)数据并将其写入写入描述符。但是,您需要跟踪要写入的数据量,因为读取不会遇到 EOF。

在大多数系统上,您的代码将向文件尾部写入大量 0xFF 字节(其中 EOF 记录为 -1)。

请注意,有 Gibibytes GiB(230 = 1,073,741,824 字节)和 Gigabytes GB(官方说法为 109 = 1,000,000,000 字节,但不常用于表示 GiB)。请参阅 Binary prefix 上的维基百科等

关于c - 在 C 文件中读取和写入(加倍),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com