大头飞飞 2020-10-16 23:27 采纳率: 50%
浏览 73
已采纳

C语言中文件读取的问题

1. 程序的目的:

该程序同时打开了2个文件,先打印第1个文件的第1行,再打印第2个文件的第1行,然后打印第1个文件的第2行,接着打印第2个文件的第2行....如此交替进行。(文件1和文件2的内容请见截图1和2)
图片说明图片说明

2. 程序初始的代码如下:

#include
#include
#include
#define LEN 256
#define STRLEN 60
char * s_gets(char * st, int n);

int main (void)
{
char * file_1;
char * file_2;
FILE * f1, * f2;
char * temp1, * temp2;
char * ptr1, * ptr2; // 用于存储fgets()返回的地址

file_1 = (char *)malloc(STRLEN * sizeof(char));
file_2 = (char *)malloc(STRLEN * sizeof(char));
temp1 = (char *)malloc(LEN * sizeof(char));
temp2 = (char *)malloc(LEN * sizeof(char));
ptr1 = (char *)malloc(LEN * sizeof(char*));
ptr2 = (char *)malloc(LEN * sizeof(char*));

printf("Please enter file1 name: ");
s_gets(file_1, STRLEN);
if((f1 = fopen(file_1, "r")) == NULL)
{
    fprintf(stderr, "Can't open file %s.\n", file_1);
    exit(EXIT_FAILURE);
}


printf("Please enter file2 name: ");
s_gets(file_2, STRLEN);
if((f2 = fopen(file_2, "r")) == NULL)
{
    fprintf(stderr, "Can't open file %s.\n", file_2);
    exit(EXIT_FAILURE);
}

while(((ptr1 = fgets(temp1, LEN, f1)) != NULL)||((ptr2 = fgets(temp2, LEN, f2)) != NULL)) // 当读取到文件结尾时, fgets() 返回 NULL
{
    if (ptr1 != NULL)
        fputs(temp1, stdout);
    if (ptr2 != NULL)
        fputs(temp2, stdout);
}
puts("Done.");
if(fclose(f1) || fclose(f2))
    fputs("Error in closing file.\n", stderr);
free(file_1);
free(file_2);
free(ptr1);
free(ptr2);
free(temp1);
free(temp2);
return 0;

}

char * s_gets(char * st, int n)
{
char * ret_val;
char * temp;

ret_val = fgets(st, n, stdin);
if (ret_val)
{
    if (temp = strchr(st, '\n'))
          *temp = '\0';
    else
          while (getchar() != '\n')
              continue;
}
return ret_val;

}

3. 初始程序存在的问题:

3.1 程序打印出乱码;
3.2 程序不能实现交替打印的功能。
运行的界面如截图3所示:
图片说明

4. 优化程序

将程序中打印文件内容部分的While循环代码更改为如下代码:
while((!feof(f1))||(!feof(f2))) // when get EOF of the file, fgets() will return NULL
{
if (fgets(temp1, LEN, f1) != NULL)
fputs(temp1, stdout);
if (fgets(temp2, LEN, f2) != NULL)
fputs(temp2, stdout);
}

问题解决,再次运行程序,得到如如下结果:
图片说明

  1. 疑问: 为什么初始程序中使用ptr1和ptr2两个指针记录fets()返回值的方法不能实现期望的功能而且还会打印出乱码呢?

展开全部

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-10-17 01:57
    关注

    https://blog.csdn.net/jarelzhou/article/details/19013037

    解决办法,用memset将内存初始化为0,再fgets读取

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部