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++文件操作、输入输出备忘 的相关文章

  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐