こんにちは。
C++ についてお尋ねします。
下のx.txtをインプットすると、y.txtがアウトプットされるC++プログラムを作りたいです。
while { } を使うことが条件です。しかし、なかなか出来ません。
while { } で文字数カウントの方法を中心に教えてください。
よろしくお願いします。
大文字、小文字共にカウントします。
例: A と a 両方カウントします。
x.txt の内容---
ll chA chI
ll chU chE
ll chO jyo
ll shi shu
ll she sho l
nyi nyu nyo
----------------
↓↓
y.txt の内容-------------------
母音の数、行数、文字数。
a の個数: 1
e の個数: 2
i の個数: 3
o の個数: 4
u の個数: 3
line の個数: 5
総文字数(全てのキャラクター): 68
-----------------------------------
#1補>
>下記の方法だと、number of characters の if が数字を読んでいないようです。
ウチで試してみたところでは、テキストに数字が含まれていても大丈夫でしたけど・・
>yesを選択し、正確なfile name を入れても、if (! inFile)に行く
おそらく、前回のinFile をclose していないせいではないでしょうか
質問者
補足
毎度、どうもありがとうございます!!
サンプルinputに
header line
this is line 1 and the only line
という2行の文が有ります。
答えでは、Number of characters: 34 になっていますが、
そのプログラムでは Number of characters: 33 となってしまいます。文中の1を読んでいません。
コンパイラはborlandです。
あと、ループの所ですが、最後の部分で
cout << "do you want to run another input file (y/n)?: " << endl;
cin >> y_n;
outFile.close();
inFile.close();
}
return 0;
}
と直したら、すんなり行きました!!
//1つの方法
#include <fstream>
#define A 0
#define I 1
#define U 2
#define E 3
#define O 4
#define NL 5
#define OTHER 6
using namespace std;
int main(){
ifstream Input("x.txt");
size_t all=0, count[7] = {0};
char c;
while(Input.get(c)){
all++;
switch(c){
case 'a':
case 'A':
count[A]++;
break;
case 'i':
case 'I':
count[I]++;
break;
case 'u':
case 'U':
count[U]++;
break;
case 'e':
case 'E':
count[E]++;
break;
case 'o':
case 'O':
count[O]++;
break;
case '\n':
count[NL]++;
break;
default:
count[OTHER]++;
}
}
ofstream Output("y.txt");
Output << "母音の数、行数、文字数。\n\n";
Output << "a の個数: " << count[A] << endl;
Output << "e の個数: " << count[E] << endl;
Output << "i の個数: " << count[I] << endl;
Output << "o の個数: " << count[O] << endl;
Output << "u の個数: " << count[U] << endl;
Output << "line の個数: " << count[NL] << endl;
Output << "総文字数(全てのキャラクター): " << all - count[NL] << endl;
return 0;
}
質問者
補足
ありがとうございます!!
一応、組んでみました。下記の方法だと、number of characters の if が数字を読んでいないようです。(inputのtxtに数字が混ざっていた場合)
あと、全体的な(一番大きい)whileのループが変な動作をします。yesを選択し、正確なfile name を入れても、if (! inFile)に行くようです。何か改良方法は有りますか?(これらが直れば、意図通りです)
#include <iostream> // for endl
#include <string> // for string
#include <iomanip> // for setw
#include <fstream> // for ifstream, ofstream
using namespace std;
int main()
{
ifstream inFile; // input file stream
ofstream outFile; // output file stream
string outputFile; // for output file name
string inputFile; // for input file name
string y_n; // for yes or no
double na, ne, ni, no, nu, L, n; // main numbers in "while"
char a, c;
y_n = "y"; // yes or no
while (y_n == "y") // if yes, loop this program.
{ // if no, go to EOF.
cout << endl;
cout << "Enter the name of the input file: ";
cin >> inputFile;
cout << endl << inputFile << endl;
inFile.open(inputFile.c_str()); // open the input file
if (! inFile) // open file error
{
cout << "Error opening input file named: " << inputFile << endl;
cout << "Terminating program now..." << endl << endl;
exit(1);
}
cout << "Enter the name of the output file: ";
cin >> outputFile;
cout << endl << outputFile << endl;
outFile.open(outputFile.c_str()); // open the output file
inFile.ignore(200,'\n'); // ignore the 1st line
na = 0; // initial number of a and A
ne = 0; // initial number of e and E
ni = 0; // initial number of i and I
no = 0; // initial number of o and O
nu = 0; // initial number of u and U
L = 0; // initial number of line
n = 1; // initial number of characters
inFile.get(a);
while (inFile.get(c)) // loop for counting the number
{
if(c=='a' || c=='A') // for a and A (vowels)
{
na++;
}
if(c=='e' || c=='E') // for e and E (vowels)
{
ne++;
}
if(c=='i' || c=='I') // for i and I (vowels)
{
ni++;
}
if(c=='o' || c=='O') // for o and O (vowels)
{
no++;
}
if(c=='u' || c=='U') // for u and U (vowels)
{
nu++;
}
if(c=='\n') // for line (without 1st line)
{
L++;
}
if(c==c) // for characters
{
n++;
}
} // end of loop for counting the number
// output numbers to file
outFile << "The input file contained the following" << endl;
outFile << "number of vowels, characters and lines:" << endl;
outFile << "----------------------------------------" << endl;
outFile << left << setw(25) << "Number of a's:" << na << endl;
outFile << left << setw(25) << "Number of e's:" << ne << endl;
outFile << left << setw(25) << "Number of i's:" << ni << endl;
outFile << left << setw(25) << "Number of o's:" << no << endl;
outFile << left << setw(25) << "Number of u's:" << nu << endl;
outFile << left << setw(25) << "Number of lines:" << L << endl;
outFile << left << setw(25) << "Number of characters" << n << endl;
cout << "do you want to run another input file (y/n)?: " << endl;
cin >> y_n;
// if yes, loop this program again.
} // if no, go to EOF.
outFile.close(); // close the output file
inFile.close(); // close the input file
return 0;
}
お礼
確かにそうです。1で有るという判断は根拠が無いです。 100に変えたら、35になりました・・・。 色々、勉強になりました。 BLUEPIXYさん、ありがとうございました!!