编程软件VS2019,用文件读取的方式读入数组的元素,数组大小没有确定
目录
3.在项目文件里创建一个文本文档,里面写数组最大长度和一组数据,以便后续读取
5.从文件里读取数组的最大长度MAXSIZE,这里我们定义的是100
1.创建一个新项目,控制台应用
2.将多余代码删除
知识点1:
为防止出现图片上的错误,在第一行加上#define _CRT_SECURE_NO_WARNINGS
3.在项目文件里创建一个文本文档,里面写数组最大长度和一组数据,以便后续读取
这里数组最大大小为100,文件里实际只有9个数据,后续会处理这个问题
将文件另存为ANSI格式
4.加上头文件,以只读的方式打开读取的文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* fp; //创建一个文件指针,在打开文件时必须先定义一个文件指针
fp = fopen("in.txt", "r"); //以只读的方式打开in.txt文件
fclose(fp); //释放文件指针
}
知识点2:
注意fopen和fclose是成对出现的,成对出现的还有new和delete、malloc和free等
知识点3:
(1)打开文件的函数fopen()形式参数有两个,第一个是文件路径,第二个是打开文件的方式
(2)如果成功地打开一个文件, fopen()函数返回文件指针, 否则返回空指针 (NULL)。
由此可判断文件打开是否成功
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp; //创建一个文件指针,在打开文件时必须先定义一个文件指针
fp = fopen("in.txt", "r"); //以只读的方式打开in.txt文件
if(fp == NULL) //文件打开失败
{
printf("打开文件失败");
exit(0); //退出程序,需加上<stdlib.h>头文件
}
fclose(fp);
}
5.从文件里读取数组的最大长度MAXSIZE,这里我们定义的是100
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp; //创建一个文件指针,在打开文件时必须先定义一个文件指针
fp = fopen("in.txt", "r"); //以只读的方式打开in.txt文件
if (fp == NULL) //文件打开失败
{
printf("文件打开失败");
exit(0); //退出程序,需加上<stdlib.h>头文件
}
int size;
fscanf(fp, "MAXSIZE=%d", &size); //scanf格式化输入,fscanf从文件进行格式化输入
fclose(fp); //释放文件指针
}
知识点4:
文件读入函数fscanf(),第一个参数是文件指针,后两个参数使用与scanf类似。函数作用就是从文件指针stream指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中
int fscanf(FILE*stream, constchar*format, [argument...]);
6.动态分配数组空间,初始化数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE* fp; //创建一个文件指针,在打开文件时必须先定义一个文件指针
fp = fopen("in.txt", "r"); //以只读的方式打开in.txt文件
if (fp == NULL) //文件打开失败
{
printf("文件打开失败");
exit(0); //退出程序
}
int size;
fscanf(fp, "MAXSIZE=%d", &size); //scanf格式化输入,fscanf从文件进行格式化输入
int* pa = (int*)malloc(sizeof(int) * size); //用malloc动态分配内存,记得free释放
memset(pa, -1, size); //初始化数组,将数组元素全部赋值为-1,
free(pa); //释放指针
fclose(fp); //释放文件指针
}
知识点5:
(1)静态数组,只能用常量定义数组大小
#define SIZE 10
int a[SIZE];
(2)动态数组,可以用变量size定义数组大小。用malloc在堆里分配内存空间,malloc返回void*类型,用强制类型转换为int*
int size = 10;
int* pa = (int*)malloc(sizeof(int) * size)
//c++的方式:int* pa = new int[size];*(pa + 5) = 100; //用指针来操作动态数组
pa[5] = 100; //用下标来操作动态数组free(pa);
//c++的方式:delete[] pa;
知识点6:
用malloc分配的内存一般用memset()初始化。memset函数用于对一段内存空间全部设置为某个字符,第一个参数是内存地址,第二个是赋的值,第三个是内存的长度
7.将数据读入数组中
//前面代码已经省略
int* pa = (int*)malloc(sizeof(int) * size); //用malloc动态分配内存
memset(pa, -1, size); //初始化数组,将数组元素全部赋值为-1
for (int i = 0; i < size; i++)
{
if (fscanf(fp, "%d", pa + i) == EOF) //将文件里的数字存入数组,pa+i还可以写为&pa[i]。EOF的值为-1
{
size = i; //10个元素,size为9,size为下标
break;
}
}
free(pa);
fclose(fp); //释放文件指针
}
8.编写自定义函数打印删除前的数组
void PrintArray(int arr[], int size)
{
for (int i = 0; i < size; i++)
{
if (arr[i] == -1) //-1表示此数组已经到头
break;
printf("%d ", arr[i]);
}
}
调用函数
//前面的代码省略
for (int i = 0; i < size; i++)
{
if (fscanf(fp, "%d", pa + i) == EOF)
{
size = i; //10个元素,size为9,size为下标
break;
}
}
//打印删除前的数组
PrintArray(pa, size);
free(pa);
fclose(fp); //释放文件指针
}
9.删除奇数,打印删除后的数组
//前面代码已省略
//打印删除前的数组
PrintArray(pa, size);
//删除奇数(拷贝偶数)
int j = 0;
for (int i = 0; i < size; i++)
{
if (pa[i] % 2 == 0)
{
pa[j] = pa[i]; //可以将a[j]看作另一个数组,将偶数放入另一个数组
j++; //放一个偶数,下标才+1
}
}
free(pa);
fclose(fp); //释放文件指针
}
打印删除后的数组
//前面代码已省略
//打印删除前的数组
PrintArray(pa, size);
//删除奇数(拷贝偶数)
int j = 0;
for (int i = 0; i < size; i++)
{
if (pa[i] % 2 == 0)
{
pa[j] = pa[i]; //可以将a[j]看作另一个数组,将偶数放入另一个数组
j++; //放一个偶数,下标才+1
}
}
//打印删除后的数组
PrintArray(pa, size);
free(pa);
fclose(fp); //释放文件指针
}
此时运行代码,发现后面的元素不对,我们得将后面的元素赋值为-1,使它们不被打印出来
//将后面的元素赋值为-1
for (; j < size; j++) //进入循环时j为偶数的个数
{
pa[j] = -1;
}
10.再次调用自定义函数,打印删除后的数组
//将后面的元素赋值为-1
for (; j < size; j++)
{
pa[j] = -1;
}
//打印删除后的数组
PrintArray(pa, size);
free(pa);
fclose(fp); //释放文件指针
}
源代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void PrintArray(int arr[], int size);
int main()
{
FILE* fp; //创建一个文件指针,在打开文件时必须先定义一个文件指针
fp = fopen("in.txt", "r"); //以只读的方式打开in.txt文件
if (fp == NULL) //文件打开失败
{
printf("文件打开失败");
exit(0); //退出程序,需加上<stdlib.h>头文件
}
int size;
fscanf(fp, "MAXSIZE=%d", &size); //scanf格式化输入,fscanf从文件进行格式化输入
int* pa = (int*)malloc(sizeof(int) * size); //用malloc动态分配内存
memset(pa, -1, size); //初始化数组,将数组元素全部赋值为-1
for (int i = 0; i < size; i++)
{
if (fscanf(fp, "%d", pa + i) == EOF) //将文件里的数字存入数组,pa+i还可以写为&pa[i]。EOF的值为-1
{
size = i; //10个元素,size为9,size为下标
break;
}
}
//打印删除前的数组
PrintArray(pa, size);
//删除奇数(拷贝偶数)
int j = 0;
for (int i = 0; i < size; i++)
{
if (pa[i] % 2 == 0)
{
pa[j] = pa[i]; //可以将a[j]看作另一个数组,将偶数放入另一个数组
j++; //放一个偶数,下标才+1
}
}
//将后面的元素赋值为-1
for (; j < size; j++)
{
pa[j] = -1;
}
//打印删除后的数组
PrintArray(pa, size);
free(pa);
fclose(fp); //释放文件指针
}
void PrintArray(int arr[], int size)
{
for (int i = 0; i < size; i++)
{
if (arr[i] == -1) //-1表示此数组已经到头
break;
printf("%d ", arr[i]);
}
printf("\n");
}