1.C++ 文件操作
1.1 普通ascii字符
1)
cin >> :结束条件: Enter、Space、Tab键
读取结束条件: while(cin >> value){}
///cin >> 后便可以跟整型,浮点型,字符串,string
char cstr[256];
string str;
cin >> cstr;
cin >> str
cout << str << cstr << endl;
cin.getline(str);
getline(cin, str);
2) 如果希望得到/丢弃某字符,
或者希望得到空格,
或希望对回车有特别处理(比如每行存在一个单独的容器中)
则需要get, ignore等:
while (cin.get(ch)){}
while (cin.get() != '\n') {
double temp;
cin >> temp;
}
用于舍弃输入流中的不需要的字符,或者舍弃回车
char str[300]
// get c-string,接收256个字节数据
std::cin.get (str,256);
// 当碰到s或者数目达到256时就停止
cin.get(str, 256, 's')
// ignore 扔掉所有until space or the number reach 256
cin.ignore(256,' ');
1.2 汉字
a. windows上
windows上vc默认编码是gb2312
一个汉字占用两个字节;c++中用宽字符wchar_t来保存一个汉字,其他对应部分为:
cin wcin
cout wcout
char wchar_t
string wstring
ifstream wifstream
用法:
int main()
{
locale china("chs");//use china character
wcin.imbue(china);//use locale object
wcout.imbue(china);
wstring s;
wchar_t wc=L'。';//wide character,wide string may be L"宽字符"
while (getline(wcin,s,wc))
{
wcout<<s<<endl;
}
}
b.linux上
linux默认似乎是UTF8编码,可以先将字符同意转为宽字符(参考附录1):
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <string>
std::wstring s2ws(const std::string& str) {
if (str.empty()) {
return L"";
}
unsigned len = str.size() + 1;
setlocale(LC_CTYPE, "");
wchar_t *p = new wchar_t[len];
mbstowcs(p, str.c_str(), len);
std::wstring w_str(p);
delete[] p;
return w_str;
}
std::string ws2s(const std::wstring& w_str) {
if (w_str.empty()) {
return "";
}
unsigned len = w_str.size() * 4 + 1;
setlocale(LC_CTYPE, "");
char *p = new char[len];
wcstombs(p, w_str.c_str(), len);
std::string str(p);
delete[] p;
return str;
}
1.3 中英文混合
2.C语言文件操作
FILE* fp;
char ch;
//注意是“r”而非‘r’
fp = fopen("1.txt", “r+");//读写,除此之外用得比较多的有”a+"追加(也有读权限)
if( NULL = fp)
printf("Failed to open the file");
ch = getchar();
//读写一个字符
fputc(ch, fp);//向文件输入一个字符,成功则返回字符ch,失败则返回EOF(-1)
ch = putchar();//将ch显示咋屏幕上
......
while(!feof(fp)){
ch = fgetc(fp);//从文件中获取(读入)一个字符,返回同上
}
//读写字符串
char str[200] = "123456779804254504358045405;
char str[10];
fputs(str, fp);//将str中的字符写入到文件中,成功则返回0
rewind(fp);//将文件读写位置标记重新指向文件开头,很重要
fseek(fp, 2, 0);//将文件读写位置标记指向离开头偏移为1(第二个字符)的位置;
char * ret = fgets(str1, 10, fp);//从文件读取9个长度的字符,失败则返回NULL
if ( ret != NULL)
printf("%s",str1);
fclose(fp);
//格式化读写文件:
fprintf(fp, "%d, %6.2f",i, j);//将变量i,j内容按照指定格式输入到fp所指向的文件中
fscanf(fp, “%d, %f", &i, &j);//从文件中获取内容。如果文件中有2,5则i = 2,j=5
fp = fopen("1.dat","rb+");//读写二进制文件
float buf[10] = {0,1,2,3,4,5,6,7,8,9};
float buff[10];
//二进制读写文件
fwrite(buf, 10, sizeof(float), fp);//从buf的数据中写10个4个字节大小的数据块 (即10个float变量)到文件fp
fread(buff, 10, sizeof(float), fp);//读文件到buff;
3.附录
1.文件指针结构体FILE中有文件位置标记,会随着读写改变;它总是指向“接下来要读或写的一个字符的位置”
2fseek(fp, 位移量, 起始点);其中起始点有0,1,2,分别表示文件开头,当前读写位置,文件结束点;位移量可以为负;
2.系统定义了stdin,stdout,stderr三个“文件指针”指向输入输出流和错误输出流,因此可以用:
fputc(ch, stdout);ch = fgetc(stdin);
exit():结束程序所在的进程(这个过程中会先释放内存,并检查文件状态,将文件缓冲区的内容写到文件)
exit(0)//正常结束进程
exit(1)//异常结束进程