在c语言之中文件的读写,先请看下面一个例子。
#include <stdio.h>
int main()
{
FILE*pFile;
char mystring[100];
char mystring1[100];
pFile=fopen("C:\\1.txt","r");
if(pFile==NULL)
return 0;
else
{
//while(fgets(mystring,100,pFile)!=NULL)
//{
// printf("%s\n",mystring);
//}
fgets(mystring,100,pFile);
printf("%s\n",mystring);
fgets(mystring1,100,pFile);
printf("%s\n",mystring1);
fclose(pFile);
}
return 1;
}
上面这个程序之中,fopen是打开这个txt文件,路径名的格式可以参照上面的,
fgets()函数的作用是一行一行读取文件中内容。如第一次调用fgets,读取文
件中的第一行内容,第二次调用,读取文件之中的第二行内容,依次直到最后。
再看下面一段程序:
#include <stdio.h>
int main()
{
FILE*pFile;
char mystring[100];
pFile=fopen("C:\\1.txt","r");
if(pFile==NULL)
return 0;
while(fgets(mystring,100,pFile)!=NULL)
{
printf("%s\n",mystring);
}
fclose(pFile);
return 1;
}
上面这个程序虽然也是利用fgets()一行一行读取文件之中的内容,但是由于加
了这个判断条件后就会把这个文件整个打印出来。如果你定义的字符串数组太
小了,无法放下文件中所有的内容,怎么办?此时fgets只会读取100-1=99个字
符串,后面的内容会自动舍去。fgets读取一行时是以"\n"来判断的,如果碰到这
个符号,则fgets会认为已经把这一行读完了。比如在你的txt文件中有空行,fgets
是会把空行读出来,并打印出来的。
说完了读取文本,再来看看写文本。
看下面一段程序。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv)
{
FILE*fp;
char str[128];
if((fp=fopen("c:\\test.txt","w"))==NULL)
{
printf("cannot open file!");
return 0;
}
while((strlen(gets(str)))!=0)
{
fputs(str,fp);
fputs("\n",fp);
}
fclose(fp);
return 1;
}
写文本时,在fp=fopen("c:\\test.txt","w")中,即使你的c盘中没有这个test.txt文件,当
你build时也会自己建立,还有当你从新重新编译,并构造它然后输入新的数据时,之
前的数据会被覆盖掉。
接下来谈到一个重要的问题函数之间数据的传递,之所以会出现这个问题是因为在上面
读取txt文件之中内容时,我一行一行读取,每读取一行,都要保存的一个字符串数组中,
然后把这些字符串数组用MD5算法加密。我想了很久,找出的解决办法是:定义一个结
构体,把这些读取到的要用的数据存储到这个结构体之中,之后要用时再从这个结构之中
取出,具体使用方法是看下面几段代码。
typedef struct
{
char phone_Number[20];
char device_Number[20];
char my_time[20];
char in_decrypt[100];
}read_info;
int ReadFile()
{
FILE*pFile;
char mystring1[100];
char mystring2[100];
memset()
read_info p;
pFile=fopen("C:\\1.txt","r");
if(pFile==NULL)
return 0;
else
{
//while(fgets(mystring,100,pFile)!=NULL)
//{
// printf("%s\n",mystring);
//}
fgets(mystring1,100,pFile);
fgets(p.phone_Number,20,pFile);
fgets(p.device_Number,20,pFile);
fgets(p.my_time,20,pFile);
fgets(mystring2,100,pFile);
fgets(p.in_decrypt,100,pFile);
if(strlen(mystring1)==0||strlen(p.phone_Number)==0||strlen(p.device_Number)==0||strlen(p.my_time)==0||strlen(mystring2)==0||strlen(p.in_decrypt)==0)
return 0;
fclose(pFile);
}
return 1;
}
int getInfoMD5()
{
MD5_CTX md5;
MD5Init(&md5); //初始化用于md5加密的结构
unsigned char encrypt[200]; //存放于加密的信息
unsigned char decrypt[17]; //存放加密后的结果
int result = 0;
read_info p;
result=ReadFile();
if(result!=1)
{
return 0;
}
strcat(encrypt,p.phone_Number);
strcat(encrypt,p.device_Number);
strcat(encrypt,p.my_time);
//scanf("%s",encrypt); //输入加密的字符
MD5Update(&md5,encrypt,strlen((char *)encrypt)); //对欲加密的字符进行加密
MD5Final(decrypt,&md5); //获得最终结果
result=strcmp(p.in_decrypt,decrypt);
if(result!=0)
{
return 0;
}
return 1;
}