亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 21427 | 回復: 15
打印 上一主題 下一主題

[C++] 請教:c++中讀文件,如何判斷文件結尾 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-02-08 16:38 |只看該作者 |倒序瀏覽
我想使用c++中ifstream進行讀文件,但是發(fā)現(xiàn)無法給出正確的文件結尾,請問如何去做?
下面是我的一段代碼:


  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.        
  13.         while (in.getline(p, sizeof(p))) //此處沒有到文件結尾就退出了,怎么才能讓他到文件結尾呢
  14.         {
  15.                        //do something to p
  16.                        memset(p, 0, sizeof(p));
  17.                 }
  18. }
復制代碼


問題:怎么才能判斷到文件結尾呢?d

另外修改了一下,還是有問題:


  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.        
  13.         while (!in.eof())//此處沒有到文件結尾就退出了,依然如故
  14.         {
  15.                        in.getline(p, sizeof(p));
  16.                        //do something to p
  17.                        memset(p, 0, sizeof(p));
  18.                 }
  19. }
復制代碼


下面的按字符讀也是有時候讀不到文件結尾:

  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.         char c;
  13.         while (!in.eof())//此處沒有到文件結尾就退出了,依然如故
  14.         {
  15.                        in.get(c); //
  16.                        //do something to p
  17.                        memset(p, 0, sizeof(p));
  18.                 }
  19. }
復制代碼


看到的一些資料說,由于eof的判斷也是一個字符,這個字符完全可能出現(xiàn)在文件中間,所以導致判斷有問題,但不知如何才能判斷到文件的結尾呢?

論壇徽章:
0
2 [報告]
發(fā)表于 2007-02-08 18:24 |只看該作者
EOF

論壇徽章:
0
3 [報告]
發(fā)表于 2007-02-09 10:43 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
4 [報告]
發(fā)表于 2007-02-09 11:48 |只看該作者
上面給的解決方案都是基于c語言的,沒有和fstream聯(lián)系在一起.
沒有人知道fstream的判斷結尾方法嗎???

論壇徽章:
0
5 [報告]
發(fā)表于 2007-02-09 11:55 |只看該作者
char buf[BUFSIZE];
do {
   in.read( buf, BUFSIZE );
   std::streamsize n = in.gcount();
   out.write( buf, n );
} while( in.good() );
if( in.bad() || !in.eof() ) {
   // fatal error occurred
}
in.close();


http://cppreference.com/cppio/eof.html

論壇徽章:
0
6 [報告]
發(fā)表于 2007-02-09 13:59 |只看該作者
ls:
通過使用你給的那段代碼,我發(fā)現(xiàn),是可以正常的讀取到文件結尾的,那么看來eof這個函數(shù)是沒有問題.
我把in.read修改為in.getline結果程序沒有讀到文件結尾就跳出了,所以我覺得是in.getline()在使用時候的問題.經(jīng)過排查,我發(fā)現(xiàn)當遇到文件中的一個字符的時候,in的流狀態(tài)變?yōu)閒ail(),于是導致了沒有讀到最后.
有誰能解釋一下什么時候會在讀文件的時候出現(xiàn)流狀態(tài)是fail(),這種情況很常見!

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. #define BUFSIZE 20

  5. int main()
  6. {
  7.         ifstream in("e:\\a.txt");
  8.         cout << in.gcount() << endl;
  9.         char buf[BUFSIZE];
  10.         int i = 0;
  11.         do {
  12.                         //in.read(buf, BUFSIZE );
  13.                         in.getline(buf, 20); //改動的地方
  14.                         std::streamsize n = in.gcount();
  15.                         cout.write( buf, n );
  16.                 } while( in.good() );//

  17.          if( in.bad() || !in.eof() )
  18.          {
  19.                  cerr << "error" << endl;
  20.          }
  21.          in.close();  
  22. }
復制代碼

論壇徽章:
0
7 [報告]
發(fā)表于 2007-02-09 14:09 |只看該作者
又經(jīng)過測試,把getline()函數(shù)換成了in.get()程序遇到那個字符,也是可以正常過去,執(zhí)行到結尾.
那么從上面的分析,可以看出是getline()這個函數(shù)導致流狀態(tài)的問題,他為什么會導致流狀態(tài)出問題呢???
請牛人幫助解釋一下流的問題?
(好像對C++了解的人很少呀,難道要去別的論壇問這些問題,暈!)

論壇徽章:
0
8 [報告]
發(fā)表于 2007-02-09 14:19 |只看該作者
通過查看MSDN,
關于getline的解釋:
If the function extracts no elements, it calls setstate(failbit). In any case, it returns *this.

說明getline什么也沒有獲取到,所有把流的狀態(tài)設置為failbit,所以出了問題.
問題在于什么情況下他才這樣設置呢?

論壇徽章:
0
9 [報告]
發(fā)表于 2007-02-09 14:21 |只看該作者
另外,怎么通過C++的函數(shù)獲取文件的大小?

論壇徽章:
0
10 [報告]
發(fā)表于 2007-02-09 14:40 |只看該作者
stat
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP