从键盘输入字符串到文件中保存

从键盘输入字符串到文件中保存,第1张

点开想要保存的文件,使用输入法软件上的软键盘可以输入特殊字符。点击保存即可。

软键盘可以实现输入特殊字符。

特殊字符,是相对于传统或常用的符号外,使用频率较少字符且难以直接输入的符号。比如数学符号。单位符号。制表符等。

设要写入的数字是int型,则用控制字符串%d和%s来完成,举例代码行如下:

fprintf(fp,"%d %s\n",12345,"abcdefg")

其中:fp是成功写打开文件指针。此代码行先向文件写入整型数字12345,再加一个空格,接着写入字符串abcdefg,然后写入'\n'。

#include "stdio.h"

#include "string.h"

void main()

{

char a[6]="china"

char temp[1024]

int n=0//记录有多少个china

FILE *outFile=fopen("c:\b.txt","r+")

FILE *inFile=fopen("c:\a.txt","r+")

while(fgets(temp,500,inFile)!=NULL)

{

int k=0

for(int i=0i<strlen(temp)i++)

{

if(temp[i]==a[k] &&k<strlen(a))

{

k++

}

else

{

if(k==strlen(a))

{

n++

fprintf(outFile,"%s

",a)

}

k=0

}

}

}

}

在C盘要有这两个文件。。。

a文件中可能有多个china ,指定加到第几行自己看情况 在设置一个int变量记录就行了

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

#include <iostream>

#include <string>

#include <fstream>

using namespace std

int main()

{

string str1

string str2

cin >>str1

cin >>str2

ofstream outfile("temp.dat",ios::binary)

if(! outfile)

{

cerr <<"Error ! " <<endl

return 0

}

outfile.write((char * )&str1,sizeof(string))

outfile.write((char * )&str2,sizeof(string))

outfile.close()

ifstream infile("temp.dat",ios::binary)

if (! infile)

{

cerr <<"Error ! " <<endl

return 0

}

infile.read((char * )&str1,sizeof(string))

infile.read((char * )&str2,sizeof(string))

cout <<str1 <<endl

cout <<str2 <<endl

return 1

}

如果我就这样执行的话,str1和str2能保存到文件,而且能够成功读取并显示。

但如果我把“保存”的那一段代码删掉,读取就会失败,显示乱码。怎么回事?怎么解决?(不要复制一大堆东西过来,谢谢。)

解析:

你保存的时候应该这样保存:

int main()

{

string str1

string str2

cin >>str1

cin >>str2

ofstream outfile("temp.dat",ios::binary)

if(! outfile)

{

cerr <<"Error ! " <<endl

return 0

}

outfile.write(str1.c_str(),str1.size()+1)

/*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。

改成这样以后,写入文件里的就是实际的字符串了。

写入的长度应该是字符串的长度(包括结束符'\0')*/

outfile.write(str2.c_str(),str2.size()+1)

outfile.close()

return 1

}

读取的时候这样读取:

int main()

{

string str1

str1.reserve(100)/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/

ifstream infile("temp.dat",ios::binary)

if (! infile)

{

cerr <<"Error ! " <<endl

return 0

}

infile.read((char * )str1.c_str(),100)/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/

cout <<str1 <<endl输出第一个字符串

cout <<(char*)(str1.c_str() + strlen(str1.c_str())+1) <<endl输出第二个字符串

return 1

}

至于原来你写的程序能够正常工作,是因为你往文件里写的是string类,包含了字符串指针,而同一个进程里面指针是不会变的,所以你读出来之后OK。

当你把“保存”的那一段代码删掉后,你再编译运行这个程序,这时str1/str2分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码。

我改的程序C语言风格有点重,呵呵,你可以自己看着再改改。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11441033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存