参考文章:
C++菜鸟教程笔记1
C++菜鸟教程笔记5
C/C++中的标准泛空格符有哪些?
C++读取文件输入流读入空格换行
C++文件流关于读到空格停止
C++的get()函数使用详解
C++中换行endl和\n的区别
c/c++中输入输出处理 按分隔符(换行、逗号、空格等)读取
#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)不一样,丢了制表符
默认忽视空白符,
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后,循环停了
如果取消了,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--------------
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
发现制表符拷贝过去了
ifs >> str
这作条件到底啥意思?#2处为啥执行一次循环体就停了?ifs.get()
从流中取一个字符是不是会改变文件位置指针?如果不是,#4中这样搞ifs.seekg(-1, std::ios::cur);
,会不会有问题?