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

2023-11-12

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++ 中文处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++文件操作、输入输出备忘 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐