C++文件操作错误

shenwenbin05 2010-11-10 11:11:16
我想通过文件操作将test.txt的内容读出并显示在屏幕上,其中test.txt的内容如下:
#include <iostream>
#include <string>
#include <algoritm>
#include <vector>
#include <functional>
#include <iterator>
using namespace std;

#include <stdio.h>
int const MAXLINE = 5;

int main(int argc,char **argv)
{
char buff[MAXLINE];
int len;

fgets(buff, MAXLINE, stdin);
len = strlen( buff );
if ( buff[len - 1] == '\n' )
{
len--;
}

cout << "fgets:" << buff << endl;
cout << "fgets end" << endl;

system("pause");
return 0;
}

现在出现了下面两个问题:
1、下面这段程序可以在VS2008上正常运行,但是在gcc下却只显示:
open test.txt successfully!
#include <iostream>

源程序:

#include <iostream>
#include <fstream>
using namespace std;

int const MAXLINE = 20;

int main(int argc,char **argv)
{
char buff[MAXLINE] = "test.txt";

fstream infile(buff, ios::in);
if ( infile == NULL)
{
cerr << "can't open file " << buff << endl;
exit(0);
}
cout << "open " << buff << " successfully!" << endl;

infile.getline(buff, MAXLINE);
cout << buff << endl;

char ch;
while ( infile.get(ch) ) //读取文件里的内容
{
cout << ch;
}
infile.close();

system("pause");
return 0;
}


2、文件读取错误
将源程序修改成下面的:

#include <iostream>
#include <fstream>
using namespace std;

int const MAXLINE = 20;

int main(int argc,char **argv)
{
char buff[MAXLINE] = "test.txt";

fstream infile(buff, ios::in);
if ( infile == NULL)
{
cerr << "can't open file " << buff << endl;
exit(0);
}
cout << "open " << buff << " successfully!" << endl;

while ( !infile.eof() )
{
memset(buff, 0, MAXLINE);
infile.getline(buff, MAXLINE);
cout << buff << endl;

}
infile.close();

system("pause");
return 0;
}

这时会进入死循环,经过单步调试,发现,在读到#include <functional>这句话的时候出现了错误
如果将int const MAXLINE = 20;改为int const MAXLINE = 50;则程序就一点错误也没有了。


不知道如何处理,请各位高手帮忙!
...全文
312 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2010-11-11
  • 打赏
  • 举报
回复
判断下,如果流状态不是good,则重新设置下流的状态
昵称很不好取 2010-11-11
  • 打赏
  • 举报
回复
如果一行数据过多,导致geiline的缓冲区不够容纳的时候就会设置failbit流标志,所以getline调用一直不会成功,所以文件feof一直不能返回true,进而导致死循环了
	_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);

if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);

_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();

for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Meta == _Metadelim)
{ // got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()->sbumpc();
break;
}
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
}
else
{ // got a character, add it to string
++_Chcount;
*_Str++ = _Traits::to_char_type(_Meta);
}
_CATCH_IO_END
}

*_Str = _Elem(); // add terminating null character
_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
return (*this);
}
赵4老师 2010-11-11
  • 打赏
  • 举报
回复
摒弃fstream
使用FILE *
#include <stdio.h>
FILE *f;
#define MAX_LINE_LEN 256
char ln[MAX_LINE_LEN];
int main() {
f=fopen("test.txt","r");
if (NULL==f) {
printf("Can not open file test.txt!\n");
return 1;
}
while (1) {
if (NULL==fgets(ln,MAX_LINE_LEN,f)) break;
printf("%s",ln);
}
fclose(f);
return 0;
}

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
shenwenbin05 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pink9527 的回复:]
buff, MAXLINE刚好12个字节,而在gcc下至少要定义MAXLINE为12
[/Quote]

我这里定义的MAXLINE =20啊
xspace_time 2010-11-11
  • 打赏
  • 举报
回复
buff, MAXLINE刚好12个字节,而在gcc下至少要定义MAXLINE为12
昵称很不好取 2010-11-10
  • 打赏
  • 举报
回复
调用rdstate打印下流的状态,看是否设置了出错的位
gules 2010-11-10
  • 打赏
  • 举报
回复
用string替换buf
shenwenbin05 2010-11-10
  • 打赏
  • 举报
回复
难道就这样了?
herman~~ 2010-11-10
  • 打赏
  • 举报
回复
用string直接getline出来吧
shenwenbin05 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ptrunner 的回复:]
所以你出现的问题肯定是越界问题所致
[/Quote]

可不可以说的详细点,到底是如何越界啊........
shenwenbin05 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liudong1105 的回复:]
infile.getline(buff, MAXLINE);这句话就到头了,后面再获取就越界了infile.get(ch)
[/Quote]

MAXLINE = 20,
infile.getline(buff, MAXLINE);这句话怎么会到头呢?文件明明没有结束啊
pstrunner 2010-11-10
  • 打赏
  • 举报
回复
while ( !infile.eof() )
{
memset(buff, 0, MAXLINE);
infile.getline(buff, MAXLINE);
cout << buff << endl;

}
=====================================
函数ifstream.getline()是读入文件的一行,就是直到回车'\n'为止。
所以你出现的问题肯定是越界问题所致,其实你说的下面这句话就已经说明问题。
“如果将int const MAXLINE = 20;改为int const MAXLINE = 50;则程序就一点错误也没有了。”
me115 2010-11-10
  • 打赏
  • 举报
回复
infile.getline(buff, MAXLINE);这句话就到头了,后面再获取就越界了infile.get(ch)
这样是没问题的
//infile.getline(buff, MAXLINE);
//cout << buff << endl;

char ch;
string strr;
while (infile.get(ch) ) //读取文件里的内容
{
//cout <<strr;
cout << ch;
}
me115 2010-11-10
  • 打赏
  • 举报
回复
这样写:
//infile.getline(buff, MAXLINE);
//cout << buff << endl;

//char ch;
string strr;
while ( getline(infile,strr))//infile.get(ch) ) //读取文件里的内容
{
cout <<strr;
//cout << ch;
}
shenwenbin05 2010-11-10
  • 打赏
  • 举报
回复
各位前辈,可不可以说的详细点啊
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows Blue(Windows 8.1),同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.0版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件,增强版中还额外包含了c++ Redistributable Package,因此增强版适合无法自行解决c++相关问题的用户使用;在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。V3.0版本使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。此功能仅限于增强版。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了3项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7用户,可以直接运行本程序。 同时鉴于Windows 8(Windows Blue、Windows 8.1)系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows Blue、Windows 8.1)系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388所有的更新以及技术支持都可以到该博客上找到。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧