C语言中文件读取的问题

1. 程序的目的:

该程序同时打开了2个文件,先打印第1个文件的第1行,再打印第2个文件的第1行,然后打印第1个文件的第2行,接着打印第2个文件的第2行....如此交替进行。(文件1和文件2的内容请见截图1和2)
C语言中文件读取的问题C语言中文件读取的问题

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所示:
C语言中文件读取的问题

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);

}

问题解决,再次运行程序,得到如如下结果:
C语言中文件读取的问题

  1. 疑问:

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

回答

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

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

以上是 C语言中文件读取的问题 的全部内容, 来源链接: utcz.com/a/62489.html

回到顶部