栈
#include<stdio.h>
#include<stdlib.h>
//栈 stack FIOL
#define FALSE -1
typedef struct Node
{
int value;
struct Node* pNext;
}Stack;
void S_Push(Stack** ppTop,int n)
{
Stack* pTemp = (Stack*)malloc(sizeof(Stack));
pTemp->value = n;
pTemp->pNext = NULL;
/*if (*ppTop == NULL || ppTop == NULL)
{
*ppTop = pTemp;
}
else
{*/
pTemp->pNext = *ppTop;
*ppTop = pTemp;
//因为重复 且当*ppTop为空时 与其无异 故仅两行代码足够
//}
return pTemp;
}
int S_Pop(Stack**ppTop)
{
if (*ppTop == NULL || ppTop == NULL)
{
return FALSE;
}
Stack* pMark = NULL;
pMark = *ppTop;
*ppTop = (*ppTop)->pNext;
int value;
value = pMark->value;
free(pMark);
pMark = NULL;
return value;
}
int main()
{
Stack* pTop = NULL;
S_Push(&pTop,1);
S_Push(&pTop, 2);
S_Push(&pTop, 3);
S_Push(&pTop, 4);
printf("%d\n",S_Pop(&pTop));
printf("%d\n", S_Pop(&pTop));
printf("%d\n", S_Pop(&pTop));
printf("%d\n", S_Pop(&pTop));
return 0;
}
当函数执行赋参的时候 顺序是由右向左
联合体
#include<stdio.h>
union AA
{
int a;
short b;
char c;
};
//所有成员共享一块空间 大小取决于最大的成员
int main()
{
union AA a;
printf("%d\n",sizeof(a));
a.a = 1;
printf("");
return 0;
}
文件
#include<stdio.h>
int main()
{
FILE* pFile = NULL;
fopen_s(&pFile, "D:\\111.txt", "r+");
//在字符串作为路径出现的时候 把所有的\都补成\\
char buf[1024] = { 0 };
size_t n;//size_t 是无符号整型的别名
n = fread(buf,1,4,pFile);
printf("%s\n", buf);
printf("%d\n", n);
fseek(pFile,1,SEEK_CUR);
fwrite("12345",1,5,pFile);
fclose(pFile);
return 0;
}
文件分为 磁盘文件 和 设备文件
磁盘文件:指一组相关数据的有序集合,通常存储在外部介质(如磁盘),使用时才调入内存。
设备文件:在操纵系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。
磁盘文件分为:文本文件 和 二进制文件
区分:用记事本打开 能看懂 文本文件 看不懂 二进制文件
文件打开
任何文件使用之前必须打开
fopen_s(文件指针,路径+打开文件的模式设置);
打开模式 | 含义 |
---|---|
r或rb | 以只读方式打开一个文本文件(不创建文件) |
w或wb | 以只写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件) |
a或ab | 以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件 |
r+或rb+ | 以可读、可写的方式打开文件(不创建新文件) |
w+或wb+ | 以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件) |
a+或ab+ | 以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件 |
注:用typora写表格 可以用 CTRL+T 方便快捷
成功返回文件指针
失败返回NULL
fclose(pFile);
操作文件
读文件 : fread(存放读取出来数据的内存空间,size指定读取文件块数的大小,nmemb读取文件块数 总大小为:size*nmemb,已打开的文件指针);
size为1 nmemb 为存放数据的内存空间的大小
返回值:
成功:返回实际读满的块数,如果比nmemb小,但大于0,说明读到文章的结尾
失败:0
EOF标记 代替-1 即文件的结尾
r+ w+ a+ 访问类型时,将同时启用读取和写入 但是,但当你从读取切换到写入时,输入操作符必须遇到EOF标记,如果没有EOF,必须使用对文件定位函数的干预调用,文件定位函数是 fsetpos,fseek,rewind,从写入切换到读取时,必须使用对fflush或文件定位函数的干预调用
fseek(文件指针,偏移的字节数(有正负),从哪个位置去偏移(SEEK_CUR(当前位置),SEEK_END(结尾位置),SEEK_SET(开头位置)));
fseek如果成功,则该函数返回零,否则返回非零值。
fwrite () 函数的返回值是成**功写入的数组成员的数量(**注意不是字节数)。
文本文件复制
#include<stdio.h>
int main()
{
FILE* pFile1 = NULL;
FILE* pFile2 = NULL;
char c;
fopen_s(&pFile1,"D:\\111.txt", "r");
fopen_s(&pFile2, "D:\\222.txt", "w");
while ((c=fgetc(pFile1)) != EOF)
{
fputc(c,pFile2);
}
fclose(pFile2);
fclose(pFile1);
return 0;
}
fgetc()返回一个字符
在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。
二进制文件复制
#include<stdio.h>
int main()
{
FILE* pFile1 = NULL;
FILE* pFile2 = NULL;
char buf[1024];
size_t nRead, nWrite;
fopen_s(&pFile1,"C:\\Users\\ctn\\Desktop\\新建 DOCX 文档.docx", "rb");
fopen_s(&pFile2,"D:\\22212.docx","wb");
while ((nRead = fread(buf,1,1024,pFile1))>0)
{
nWrite = fwrite(buf,1,nRead,pFile2);
//读多少写多少
printf("read %d write %d\n",nRead,nWrite);
}
fclose(pFile1);
fclose(pFile2);
return 0;
}