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);
}
问题解决,再次运行程序,得到如如下结果:
- 疑问:
为什么初始程序中使用ptr1和ptr2两个指针记录fets()返回值的方法不能实现期望的功能而且还会打印出乱码呢?
回答
https://blog.csdn.net/jarelzhou/article/details/19013037
解决办法,用memset将内存初始化为0,再fgets读取
以上是 C语言中文件读取的问题 的全部内容, 来源链接: utcz.com/a/62489.html