C++读取文本文件
比如读取下面的txt文件,希望能够分段读取。就是中间的空横作为一个分隔的字符。
即:
1.你今年大几?
A 大一
B 大二
C 大三
D 大四
保存在一个字串符
2.你的性别是?
A 男
B 女
保存在另外一个,其他类推
//test.txt
1.你今年大几?
A 大一
B 大二
C 大三
D 大四
2.你的性别是?
A 男
B 女
3.你的学院是?
A 药学院
B 医学院
C 人文社科学院
D 外国语学院
E 其他
end
[解决办法]
[code=C/C++][/code]
#include <stdio.h>
int main(void)
{
FILE* file=fopen("text.txt","r");
if(file==NULL)
{
printf("打开文件失败\n");
}
while(1)
{
char buf[1024]="";
fgets(buf,1024,file);
printf("%s",buf);
if (feof(file))
break;
}
fclose(file);
return 0;
}
[解决办法]
发现之前写的代码有BUG,最后一行的end没读到,另外如果文件以空行结尾会产生错误,调了半天才调好,见笑了
这下可以放心睡觉了...
- C/C++ code
#include <iostream>#include <fstream>using namespace std;int main(void) { ifstream ifs("test.txt",ios::binary); if(!ifs) { cout << "打开文件失败\n" << endl; } char *pszText[1000]={NULL}; int i=0; long posStart=0,posEnd=0; int size=0; int flag=0; while(!ifs.eof()) { posStart=ifs.tellg(); while(!ifs.eof()) { char temp[256]=""; ifs.getline(temp,sizeof(temp)); if(temp[0]=='\0')//遇到空行时,什么内容也不会读取temp[0]=='\0' { break; } } if(!ifs.eof()) { if(!ifs.eof()) ifs.seekg(-1,ios::cur);//回退到空行之前 posEnd=ifs.tellg(); }else {//如果已经到了文件尾,则按如下方式获取posEnd ifs.clear();//之前没加这一句,老出错,恼死我了 ifs.seekg(0,ios::end);// posEnd=ifs.tellg(); flag=1;//到结尾标记一下 } size=posEnd-posStart;//整个字符的大小 ifs.seekg(posStart);//回到起始点 pszText[i]=new char[size+1];//分配空间 ifs.read(pszText[i],size);//读入 i++;//下标后移 if(flag) break; else ifs.seekg(posEnd+1);//再回到空行之后。 } i=0; while(pszText[i]) { cout << pszText[i] << endl;//打印 i++; } i=0; while(pszText[i]) { delete[] pszText[i];//释放 i++; } return 0;}
[解决办法]
- C/C++ code
//test.cpp#include <iostream>#include <fstream>#include <vector>#include <string>int main(){ using namespace std; char filename[] = "test.txt"; ifstream fin; fin.open(filename, ios_base::in); if (!fin.is_open()) { cerr << filename << "打开错误,程序终止。\n"; exit(EXIT_FAILURE); } string temp, line; vector<string> choice; getline(fin, temp); while (fin && temp != "end") { if (temp != "") //不是空行,把读取的字符串加起来 { line += temp; line += ' '; //每行加一个空格区分不同的字段,也可以加其他字符或者不加 } else if (line != "") //是空行且line不空,一个line结束,存到容器中 { choice.push_back(line); line = ""; } getline(fin, temp); } fin.close(); for (int i = 0; i < choice.size(); i++) cout << choice[i] << endl; return 0;}