标题:C读取文件的问题
只看楼主
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
结帖率:66.67%
已结贴  问题点数:30 回复次数:7 
C读取文件的问题
自己编辑了一个简单的test.txt文件放在桌面,之后使用以下函数读取文件内容,发生异常中断,且读取不正确,不知道问题在哪里,望指教,谢谢各位!(test.txt和出错问题图片都放在附件的压缩文件
test.zip (35.6 KB)
里了)

#include"iostream"
using namespace std;
int main(void)
{
    char * pBuf=new char[500];
    memset(pBuf,'\0',sizeof(pBuf));
    cout<<"pBuf="<<pBuf<<endl;
    if(NULL==pBuf)
    {
        cout<<"pBuf memory allocate fail!\n";
        exit(-1);
    }
    char * pstr[255];
    FILE * pFile=fopen("C:\\Users\\Administrator\\Desktop\\test.txt","r");
    if(NULL==pFile)
    {
        cout<<"pFile==NULL\nFile can't open!";
        exit(-1);
    }
    fseek(pFile,0,SEEK_SET);
    char ch='\0';
    unsigned int i=0;
    while(!(feof(pFile)))
    {
        memset(pBuf,'\0',sizeof(pBuf));
        for(i=0;((ch=fgetc(pFile))!='\n');++i)
        {
            pBuf[i]=ch;
            //cout<<"ch="<<ch<<endl;
        }
        pBuf[i]='\0';
        cout<<"pBuf="<<pBuf<<endl;
        //system("pause");
    }
    rewind(pFile);
    fclose(pFile);
    return 0;
}
搜索更多相关主题的帖子: include 压缩文件 memory 图片 
2014-12-16 11:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
这样的文本文件,你搞那么复杂干什么?读到的数据打算怎么用?

授人以渔,不授人以鱼。
2014-12-16 11:50
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:6 
在for循环里,加一个判断条件。
程序代码:
for(i=0;((ch=fgetc(pFile))!='\n');++i)
        {
            if (feof(pFile))
                break;
            pBuf[i]=ch;
            //cout<<"ch="<<ch<<endl;
        }

~~~~~~我的明天我知道~~~。
2014-12-16 11:55
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
得分:0 
这只是一个测试程序,因为实际要读取的txt文件数据较大,其后对数据的处理也有点复杂。问题的关键是读取文件结尾时出错。
2014-12-16 11:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:6 
大文件有大文件的处理方法,与小文件不一样,大到什么程度又有不同的处理方法。教你处理小文件,不见得可用于你的真正目的。

授人以渔,不授人以鱼。
2014-12-16 12:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:18 
错的地方太多,建议你多看书
程序代码:
#include <iostream>
#include <new>
#include <cstdio>
using namespace std;

int main( void )
{
    char* pBuf = new(std::nothrow) char[500];
    if( !pBuf )
    {
        cerr << "memory allocate failed.\n";
        return 1;
    }

    FILE* pFile = fopen( "C:\\Users\\Administrator\\Desktop\\test.txt", "r" );
    if( !pFile )
    {
        cerr << "test.txt open failed.\n";
        return 1;
    }

    while( !feof(pFile) )
    {
        size_t i = 0;
        for( int ch; i<500-1 && (ch=fgetc(pFile), ch!=EOF && ch!='\n'); )
            pBuf[i++] = ch;
        pBuf[i++] = '\0';

        cout << pBuf << (i==500?"":"\n") << flush;
    }

    fclose( pFile );
    delete[] pBuf;

    return 0;
}



[ 本帖最后由 rjsp 于 2014-12-16 12:40 编辑 ]
2014-12-16 12:08
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
得分:0 
问题的关键是这一句——for( int ch; i<500-1 && (ch=fgetc(pFile), ch!=EOF && ch!='\n'); ),当时其实也考虑到了这一点,一开始写的是:ch=fgetc(pFile)!= '\n' && ch=fgetc(pFile)!=EOF,但是转念一想,这样的话,文件位置指针会多跳一个字节的内容,且想当然地认为外层的while( !feof(pFile) )一样能起到终止文件的作用,却忽略了内层的for循环有可能先遇到EOF,从而产生死循环的问题。谢谢大家,大家的意见都有一定的价值,相对来说,还是rsjp给的帮助比较大,给他的分也会多些。
2014-12-16 17:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 7楼 xiedj
呵呵,谢谢,那我将你代码中的主要错误说一下吧

#include"iostream" // 应该写成#include <iostream>,详见https://bbs.bccn.net/viewthread.php?tid=439995&page=1#pid2458484
using namespace std;
int main(void)
{
    char * pBuf=new char[500];
    memset(pBuf,'\0',sizeof(pBuf)); // 有三个错误 1. 判断分配失败在后,使用之在前?
                                                  2. sizeof(pBuf)可不是500,pBuf的类型是char*,不是char[500]
                                                  3. 你没必要给pBuf指向的内存赋值。在工作中,这是最重要的,即,千万不要在代码中做多余无用的小动作。别人需要花费大量的精力来验证你的这段代码确实是多余的。
    if(NULL==pBuf) // new失败并不是返回NULL,而是抛出std::bad_alloc异常。(不要用那些错误的编译器,如VC6,来验证这一点)
    {
        exit(-1); // 应该用return,除了驱动程序,不要在C++中用exit,C++中的资源不仅仅是 内存 和 文件句柄 之类
                  // 另外,尽量不要在main中return负数和太大的数,当然了,这不是C/C++的问题,不讲。
    }
2014-12-17 09:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439998-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.431785 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved