ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++学习——输入文件流遇空白符结束

2021-10-11 11:02:11  阅读:448  来源: 互联网

标签:std 流遇 sentence ifs C++ str enter 空白符


参考文章:
C++菜鸟教程笔记1
C++菜鸟教程笔记5
C/C++中的标准泛空格符有哪些?
C++读取文件输入流读入空格换行
C++文件流关于读到空格停止
C++的get()函数使用详解
C++中换行endl和\n的区别
c/c++中输入输出处理 按分隔符(换行、逗号、空格等)读取

!!!写的不好的地方麻烦大佬指点下

#1. 遇到空白符换行

#include <iostream>
#include <fstream>
#include <string.h>
int main(void)
{
  std::fstream fs;
  fs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\afile.dat", std::ios::trunc | std::ios::out);
  if (!fs)
  {
    std::cout << "open afile.dat err!" << std::endl;
    exit(-1);
  }
  char str[100];

  std::cout << "enter sentence 1 : ";
  std::cin >> str;
  fs << str;

  std::cout << "enter sentence 2 : ";
  std::cin >> str;
  
  // fs << str << std::endl; // =》 '\n' + end
  // fs << str << '\n';
  fs << str << '\t'; // !!!这边直接插空白符跟在 str(控制台输23)后面
  // fs << str << '\v';
  // fs << str << '\f';
  // fs << str << '\r';
  // fs << str << ' ';

  std::cout << "enter sentence 3 : ";
  std::cin >> str;
  fs << str;

  fs.close();

  // 读取文件a,并复制到b
  std::ifstream ifs;
  ifs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\afile.dat");
  if (!ifs)
  {
    std::cout << "open afile.dat err!" << std::endl;
    exit(-1);
  }
  std::ofstream ofs;
  ofs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\bfile.dat", std::ios::trunc);
  if (!ofs)
  {
    std::cout << "open bfile.dat err!" << std::endl;
    exit(-1);
  }
  int i = 0;
  while (ifs >> str)
  {
    std::cout << "chunk" << ++i << " : " << str << std::endl;
    ofs << str;
  }

  ifs.close();
  ofs.close();

  printf("--------------end--------------\n");
  return 0;
}

输出结果:

enter sentence 1 : 12
enter sentence 2 : 23
enter sentence 3 : 34
chunk1 : 1223
chunk2 : 34
--------------end--------------

发现文件输入流到空白符(’\t’)停止,并跳过。我不想跳过

文件afile.dat内容

1122 33

文件bfile.dat内容

112233

生成复制的文件(bfile.dat)不一样,丢了制表符

#2. 取消输出流默认的忽视空白符

默认忽视空白符,ifs >> str 我的理解是将空白符前面的文件流提取到变量str里,之后默认的将文件位置指针定位到空白符之后,实现跳过空白符的功能,while循环语句中的自增就有了 。

该方法可以取消输出流默认的忽视空白符

void std::ios_base::unsetf(std::ios_base::fmtflags __mask)
int i = 0;
ifs.unsetf(std::ios::skipws); // 取消默认的忽视空白字符

while (ifs >> str)
{

  std::cout << "chunk" << ++i << " : " << str << std::endl;
  ofs << str;
}

输出结果:

enter sentence 1 : 12
enter sentence 2 : 23
enter sentence 3 : 34
chunk1 : 1223
--------------end--------------

发现chunk1后,循环停了

#3. get()方法取字符

如果取消了,while循环语句的自增就没了,找个替代的,get方法。

int std::istream::get()
std::istream &std::istream::get(char &__c)

三参的就不列了

下面使用get()方法

int i = 0;
ifs.unsetf(std::ios::skipws); // 取消默认的忽视空白字符
while (ifs >> str)
{
  ifs.get();// 从ifs文件输入流中读取一个字符

  std::cout << "chunk" << ++i << " : " << str << std::endl;
  ofs << str;
}

执行结果:

enter sentence 1 : 12
enter sentence 2 : 23
enter sentence 3 : 34
chunk1 : 1223
chunk2 : 34
--------------end--------------

#4.取存空白符

while(ifs >> str) 做循环条件我没搞太懂,我把它放循环体了

int i = 0;
char ch = '\0';
ifs.unsetf(std::ios::skipws); // 取消默认的忽视空白字符
while (1)
{
  ch = ifs.get(); // 该函数会改变文件位置指针??
  if (ch == EOF)
  {
    std::cout << "read file is over!" << std::endl;
    break;
  }
  else if (ch == '\n' || ch == '\t' || ch == '\v' || ch == '\f' || ch == 'r' || ch == ' ')
  {
    std::cout << "it is a white-space character !!!" << std::endl;

    std::cout << "chunk" << ++i << " : " << ch << std::endl;
    ofs << ch;// 保存空白字符
  }
  else
  {
    ifs.seekg(-1, std::ios::cur); // 普通字符回位,中文字符这边会有问题
    std::cout << "ch : " << ch << std::endl;

    ifs >> str;// 这个放里面!!!
    std::cout << "chunk" << ++i << " : " << str << std::endl;
    ofs << str;
  }
}

运行结果:

enter sentence 1 : 12
enter sentence 2 : 23
enter sentence 3 : 34
ch : 1
chunk1 : 1223
it is a white-space character !!!
chunk2 :
ch : 3
chunk3 : 34
read file is over!
--------------end--------------

afile.dat

1223 34

bfile.dat

1223 34

发现制表符拷贝过去了

疑问

  1. while(ifs >> str), ifs >> str这作条件到底啥意思?#2处为啥执行一次循环体就停了?
  2. ifs.get() 从流中取一个字符是不是会改变文件位置指针?如果不是,#4中这样搞ifs.seekg(-1, std::ios::cur);,会不会有问题?

  1. std::fstream待试
  2. getline使用
  3. 中文文本文件读写
  4. 正则空白字符匹配

标签:std,流遇,sentence,ifs,C++,str,enter,空白符
来源: https://blog.csdn.net/qq_43811107/article/details/120693347

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有