C/C++文件操作、输入输出备忘

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)//异常结束进程

reference:

Linux C++ 中文处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值