#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <process.h>
using namespace std;
int main(){
system("cls");
char mline[75];
int lc=0;
ofstream fout("out.txt",ios::out);
ifstream fin("data.txt",ios::in);
if(!fin){
cerr<<"Failed to open file !";
exit(1);
}
while(1){
fin.getline(mline,75,'.');
if(fin.eof()){break;}
lc++;
fout<<lc<<". "<<mline<<"\n";
}
fin.close();
fout.close();
cout<<"Output "<<lc<<" records"<<endl;
return 0;
}
以上代码应该从文件“data.txt”中读取以下文本
“ifstream类型流的默认行为(打开文件时)允许用户 从文件中读取内容。如果文件模式是ios :: in,则只读取 在文本文件上执行,如果文件模式还包含ios :: binary ios :: in,读取以二进制模式执行。没有人物的转变 以二进制模式发生,而特定的转换发生在文本模式中。“
并创建一个文件out.txt,其中使用行号存储相同的文本(一行可以有75个字符或以'。'结尾 - 以较早者为准)。
每当我运行该程序时,它就会卡在控制台上 - 按下任何键都没有响应。
有人能告诉我这里发生了什么吗?
答案 0 :(得分:4)
如果文件中任何一次尝试读取的时间超过74个字符,getline
会为failbit
设置fin
,您永远不会到达文件的末尾。将您的代码更改为以下内容:
for (; fin; ++lc) {
fin.getline(mline,75,'.');
if (!fin.eof() && !fin.bad())
fin.clear();
fout<<lc<<". "<<mline<<"\n";
}
如果你到达文件的末尾或者流发生了灾难性的事情,这将打破你的循环。如果文件以句点结束,您还需要考虑处理执行的额外读取。
考虑切换到std::string
。
#include <iostream>
#include <fstream>
#include <string>
int main()
{
int lc = 0;
std::ofstream fout("out.txt");
std::ifstream fin("data.txt");
for (std::string line; getline(fin, line, '.'); )
fout << ++lc << ". " << line << "\n";
std::cout << "Output " << lc << " records\n";
}