[英]I can't figure out why “cout” didn't work properly
我編寫了用於實現文件I / O的代碼。 此代碼包含兩個功能-一個用於將字符寫入文本文件,另一個用於從文本文件讀取字符。
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
#include <fstream>
using namespace std;
int writefile(const char* f)
{
int cnt = 0;
char c;
ofstream ofile;
ofile.open(f);
while (true)
{
cout << "input character:";
cin >> c;
if (cin.eof())
break;
ofile << c;
cnt++;
}
ofile.close();
return cnt;
}
int readfile(int n, const char* f)
{
int cnt = 0;
ifstream ifile;
ifile.open(f);
do
{
cout << static_cast<char>(ifile.get());
cnt++;
} while (cnt<n);
cout << endl;
ifile.close();
return cnt;
}
int main(void)
{
char ch;
int num,total,sum;
const char* filename = "test.txt";
total = writefile(filename);
cout << total<<" characters were written successfully." << endl;
cout << "how many characters?";
cin >> num;
sum = readfile(num,filename);
cout << sum << " characters were read successfully." << endl;
system("pause");
return 0;
}
問題是這樣的:cout <<“多少個字符?”; cin >> num;
這部分不起作用。 我本來想顯示用戶輸入的字符數,但無法輸入字符數。 我希望你們選擇問題所在。
問題是在writefile()
您將讀取流,直到到達文件末尾。 一旦你這樣做文件標志到底cin
將被設置和cin
將不再從輸入讀取。 您需要調用clear()
來刪除該標志並繼續閱讀。
您需要的是cout << "how many characters?";
之后的以下內容cout << "how many characters?";
:
std::cin.clear();
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // must #include <limits>
std::cin.unget(); // THIS IS IMPORTANT
第一行清除流的錯誤標志,因為您一直讀到EOF,所以將其設置為ios::eofbit
。 第二行忽略流中剩下的所有內容,包括定界符(在這種情況下為換行符'\\n'
)或EOF(無論EOF是否被丟棄 ),以先到者為准。 最后一行很重要,因為否則您的流仍將包含EOF,因此您需要丟棄它。
在writefile
,循環直到cin.eof
。 eof
表示“文件結束”:明確地,這里沒有更多輸入。 就其本身而言,這是一個永久性的條件,例如杯子是空的:“我想再喝一口,但什么也沒發生!”
您可以調用cin.clear()
但這cin.clear()
:就像裝滿用過的錫罐一樣。 更好的方法可能是測試空白行,例如通過測試
if (c == '\n')
現在,用戶可以鍵入字符直到完成操作,然后只需按Enter。
您可能應該將eof視為錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.