fgets会在读完之后把下一个设成 \0 可是如果有一行 是 abcdefg
我 fgets(buffer,3,fp);
这样得到的只是ab\0  .虽然我可以在下一次fgets得到 cdefg,但是我就不能判断ab 和cdefg本来是同一行的了如果想避免这个情况,就必须知道文本文件一行的最大字节数吗?

解决方案 »

  1.   

    你把buffer申请大点不就行了
    否则,你就需要自己判断了
      

  2.   

    fgets会返回所读的字节数,可以用这个判断
      

  3.   

    每次尽量读多一些,文本文件一行最多256byte
      

  4.   

    使用CStdioFile 的ReadString读取文件。一次读一行
      

  5.   

    文本文件一行最多256byte?
    ==========
    不是吧,我一行都到了64K了,ultraedit还没有报错?
      

  6.   

    使用CStdioFile 的ReadString读取文件。一次读一行
    ============
    他内部是怎么做的,不用gets,用fread,判断\n\r? 我觉得这样才能根除我的问题?
      

  7.   

    比如我一次fread读4K,然后判断是否有\n\r,如果有,就把\n\r之前的取出来.如果这4K中没有\n\r,那我就再取4K,直到碰到\n\r,就把之前的多个4K,和最后一个4k中\n\r 前面的部分连接起来,返回给调用者好像stl就是这么做的吧 . ifsteam ifile("a.txt");  ifile.getline(str,"\n")getline的第二个参数是行结束符,模式是"\n".
      

  8.   

    char buffer[512] = {0};
    fgets(buffer,sizeof(buffer),fp);
    if(feof(fp))
    {
    return 0;
    }
    int len=strlen(buffer);
    strncpy(szPhoneNum,buffer,len-1); //fgets() 会获取一换行符,所以这里去掉
      

  9.   

    LPTSTR CStdioFile::ReadString(LPTSTR lpsz, UINT nMax)
    {
    ASSERT(lpsz != NULL);
    ASSERT(AfxIsValidAddress(lpsz, nMax));
    ASSERT(m_pStream != NULL); if (lpsz == NULL)
    {
    AfxThrowInvalidArgException();
    } LPTSTR lpszResult = _fgetts(lpsz, nMax, m_pStream);
    if (lpszResult == NULL && !feof(m_pStream))
    {
    clearerr(m_pStream);
    AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
    }
    return lpszResult;
    }BOOL CStdioFile::ReadString(CString& rString)
    {
    ASSERT_VALID(this); rString = _T("");    // empty string without deallocating
    const int nMaxSize = 128;
    LPTSTR lpsz = rString.GetBuffer(nMaxSize);
    LPTSTR lpszResult;
    int nLen = 0;
    for (;;)
    {
    lpszResult = _fgetts(lpsz, nMaxSize+1, m_pStream);
    rString.ReleaseBuffer(); // handle error/eof case
    if (lpszResult == NULL && !feof(m_pStream))
    {
    clearerr(m_pStream);
    AfxThrowFileException(CFileException::generic, _doserrno,
    m_strFileName);
    } // if string is read completely or EOF
    if (lpszResult == NULL ||
    (nLen = (int)lstrlen(lpsz)) < nMaxSize ||
    lpsz[nLen-1] == '\n')
    break; nLen = rString.GetLength();
    lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;
    } // remove '\n' from end of string if present
    lpsz = rString.GetBuffer(0);
    nLen = rString.GetLength();
    if (nLen != 0 && lpsz[nLen-1] == '\n')
    rString.GetBufferSetLength(nLen-1); return nLen != 0;
    }
      

  10.   

    这是MFC的源代码吗,为什么这些源代码是公开的?大体看了一下,明天到公司再仔细看看。 如果理解,能不能大体讲一下他的思路
      

  11.   

    好像就跟我上面说得一样。循环调用fgets,一直分配空间,直到碰到一个换行符号。LPTSTR CStdioFile::ReadString(LPTSTR lpsz, UINT nMax)是让用户自己控制行。BOOL CStdioFile::ReadString(CString& rString)保证能读取到整行。
    另外能不能解释一下为什么MFC有些是有源代码有些是没有的?
    Microsoft Visual Studio\VC98\MFC\SRC 都是源代码啊。