fgets会在读完之后把下一个设成 \0 可是如果有一行 是 abcdefg
我 fgets(buffer,3,fp);
这样得到的只是ab\0 .虽然我可以在下一次fgets得到 cdefg,但是我就不能判断ab 和cdefg本来是同一行的了如果想避免这个情况,就必须知道文本文件一行的最大字节数吗?
我 fgets(buffer,3,fp);
这样得到的只是ab\0 .虽然我可以在下一次fgets得到 cdefg,但是我就不能判断ab 和cdefg本来是同一行的了如果想避免这个情况,就必须知道文本文件一行的最大字节数吗?
否则,你就需要自己判断了
==========
不是吧,我一行都到了64K了,ultraedit还没有报错?
============
他内部是怎么做的,不用gets,用fread,判断\n\r? 我觉得这样才能根除我的问题?
fgets(buffer,sizeof(buffer),fp);
if(feof(fp))
{
return 0;
}
int len=strlen(buffer);
strncpy(szPhoneNum,buffer,len-1); //fgets() 会获取一换行符,所以这里去掉
{
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;
}
另外能不能解释一下为什么MFC有些是有源代码有些是没有的?
Microsoft Visual Studio\VC98\MFC\SRC 都是源代码啊。