在C中多次打开和关闭同一个文件是不是一种糟糕的做法



我的C程序做3件事:

  1. 从文本文件中读取
  2. 将所有字母转换为大写
  3. 将转换后的文本打印到控制台中

以下是我在程序中打开和关闭这两个文件的次数:
Original=>1表示";r〃
新建=>2首先表示";w+";并且最后为"0";r〃;

有没有更好的方法可以在不多次打开和关闭的情况下写入文件并从中读取?(尽管我只打开和关闭了两次,但我想建立一个良好的实践(

#include <stdio.h>
#include <ctype.h>
int main()
{
const char ORIGINAL[] = "challenge2.txt";
FILE *fp = NULL;
FILE *fpNew = NULL;
char ch, ch2;
///////////// open the original txt file to read /////////////
fp = fopen(ORIGINAL, "r");
if (fp == NULL)
{
perror("Error opening the file");
return (-1);
}
///////////// create and write on a new file /////////////
fpNew = fopen("challenge2_copy.txt", "w+");
printf("n============== Original text ==============n");
while ((ch = fgetc(fp)) != EOF)
{
printf("%c", ch);
ch = toupper(ch);
fputc(ch, fpNew);
}
fclose(fp);
fp = NULL;
fclose(fpNew);
fpNew = NULL;
///////////// call the new file to print the converted text /////////////
fpNew = fopen("challenge2_copy.txt", "r");
if (fpNew == NULL)
{
perror("Error opening the file");
return (-1);
}

printf("n============== Converted to Uppercase ==============n");
while ((ch2 = fgetc(fpNew)) != EOF)
{
printf("%c", ch2);
}
fclose(fpNew);
fpNew = NULL;
return 0;
}

这是控制台输出:

============== Original text ==============
hello I AM JACK
I AM TESTING lowerCASE
GONNA convert THIS into
UPPERcase
i hope THIS works
============== Converted to Uppercase ==============
HELLO I AM JACK
I AM TESTING LOWERCASE
GONNA CONVERT THIS INTO
UPPERCASE
I HOPE THIS WORKS

良好做法、性能、危险

  • MS Visual Studio建议使用fopen_s作为良好做法:(
  • 有时重新打开文件有时会使代码在大型项目中更清晰易读
  • 至于性能,处理器将需要一些时间来创建新的FILE实例并用所有文件属性填充它
  • 也可能会有一些中断,例如在释放所有权一段时间后进行云同步。工具可能想要备份新创建的文件,并将阻止其他应用程序访问该文件。(您的程序(

性能解决方案

为了重用FILE实例,您只需要跳转到FILE缓冲区中的不同位置(例如文件的开头(。您可以使用stdio.h中的fsetposfseek函数来实现它
https://www.cplusplus.com/reference/cstdio/fsetpos/
https://www.cplusplus.com/reference/cstdio/fseek/

FILE实例重用示例

/* fsetpos example */
#include <stdio.h>
int main ()
{
FILE * pFile; fpos_t position;
#define buffSize 1024 //1KB
char s[buffSize];

//Write
pFile = fopen ("myfile.txt","w+");
fgetpos (pFile, &position);
fputs ("That is a sample",pFile);

//Reuse for reading
fsetpos (pFile, &position);
puts (fgets(s,buffSize, pFile));
//Next reuse for reading
fsetpos (pFile, &position);
puts (fgets(s,buffSize, pFile));

fclose (pFile);
return 0;
}

上述代码产生以下结果:

That is a sample
That is a sample

相关内容

  • 没有找到相关文章

最新更新