C++ 如何在C++;?
我想做的基本上是写一个函数,它把一个参数作为一个文件名,如果有多个文件,它会把文件名作为一个参数,它应该用一个函数重复这样做。我该怎么做? 谢谢 Txt文件是这样的 例如,sorular.txt: //世界上最拥挤的国家是哪个?C++ 如何在C++;?,c++,file,loops,input,ifstream,C++,File,Loops,Input,Ifstream,我想做的基本上是写一个函数,它把一个参数作为一个文件名,如果有多个文件,它会把文件名作为一个参数,它应该用一个函数重复这样做。我该怎么做? 谢谢 Txt文件是这样的 例如,sorular.txt: //世界上最拥挤的国家是哪个? //中国 //美国 //德国 //澳大利亚 //中国 int main(){ 字符串数组[5]; 弦线; 字符串回答; 静态int trueCount=0; 静态整数假计数=0; ifstream文件(“/Users/User/QuizMaker/quickmaker
//中国
//美国
//德国
//澳大利亚
//中国
int main(){
字符串数组[5];
弦线;
字符串回答;
静态int trueCount=0;
静态整数假计数=0;
ifstream文件(“/Users/User/QuizMaker/quickmaker V2/sorular.txt”);
if(file.is_open()){
首先让我说,array
不能容纳元素0
、1
、2
、3
、4
和5
。它只分配了5个元素
这可能会扩大你的视野,但我认为正确的解决方案是在这里建立一个类。因此,我将一起解决这个问题,如果你感兴趣,你可以研究一下我所做的工作,如果你不了解一些事情,请随时在评论中提问
class foo : public iterator<input_iterator_tag, string> {
const initializer_list<const char*> _files;
decltype(_files)::const_iterator _filesIt;
ifstream _file;
string _line;
void get() {
string array[6];
auto i = begin(array);
while (i != end(array) && getline(_file, *i)) {
advance(i, 1);
}
if (i == end(array)) {
_line = accumulate(cbegin(array), cend(array), string(), [](const auto& a, const auto& b) { return a.empty() ? b : a + '\n' + b; });
} else if(++_filesIt != cend(_files)) {
_file.close();
_file.open(*_filesIt);
get();
}
}
public:
foo() : _filesIt(cend(_files)) {}
foo(foo& rhs) : _files(rhs._files), _filesIt(next(cbegin(_files), distance(cbegin(rhs._files), rhs._filesIt))), _line(rhs._line) {
if (_filesIt != cend(_files)) {
_file.open(*_filesIt);
_file.seekg(rhs._file.tellg());
}
}
foo(const initializer_list<const char*>&& files) : _files(files), _filesIt(cbegin(_files)), _file(*_filesIt) { get(); }
const string& operator*() const { return _line; }
const foo& operator++() {
get();
return *this;
}
const foo operator++(int) {
foo result;
get();
return result;
}
bool operator==(const foo& rhs) { return distance(_filesIt, cend(_files)) == distance(rhs._filesIt, cend(rhs._files)); }
bool operator!=(const foo& rhs) { return distance(_filesIt, cend(_files)) != distance(rhs._filesIt, cend(rhs._files)); }
};
类foo:公共迭代器{
常量初始值设定项\u列表\u文件;
decltype(_files)::常量迭代器_filesIt;
ifstream\u文件;
弦线;
void get(){
字符串数组[6];
自动i=开始(数组);
while(i!=end(array)&&getline(_文件,*i)){
预付款(一、1);
}
if(i==结束(数组)){
_line=accumulate(cbegin(数组),cend(数组),string(),[](常量自动&a,常量自动&b){返回a.empty()?b:a+'\n'+b;});
}如果(++\u filesIt!=cend(\u files))则为else{
_file.close();
_打开(*\u filesIt);
get();
}
}
公众:
foo():_filesIt(cend(_files)){}
foo(foo和rhs):_文件(rhs._文件),_文件(下一个(cbegin(_文件),距离(cbegin(rhs._文件),rhs._文件)),_线(rhs._线){
如果(_filesIt!=cend(_files)){
_打开(*\u filesIt);
_seekg(rhs._file.tellg());
}
}
foo(常量初始值设定项列表和文件):\u文件(文件),\u文件(cbegin(\u文件)),\u文件(*\u文件){get();}
常量字符串和运算符*()常量{return_line;}
常量foo&运算符++(){
get();
归还*这个;
}
常量foo运算符++(int){
foo结果;
get();
返回结果;
}
布尔运算符==(const foo&rhs){返回距离(_filesIt,cend(_files))==距离(rhs._filesIt,cend(rhs._files));}
布尔运算符!=(const foo&rhs){返回距离(_filesIt,cend(_files))!=距离(rhs._filesIt,cend(rhs._files));}
};
虽然这个类看起来很强大,但它极大地简化了您要编译的其余部分。使用这个类,您的其余代码将如下所示:
auto true_count = 0;
auto false_count = 0;
for_each(foo({"/Users/User/QuizMaker/Quiz Maker V2/sorular.txt", "foo.txt", "bar.txt"}), foo(), [&](const auto& i) {
string answer;
cout << i << endl;
cin >> answer;
if(answer == "C" || answer == "c") {
cout << 1;
true_count++;
} else {
false_count++;
}
});
cout << "You answered "<< trueCount << " questions as true" << endl << "You answered " << falseCount << " questions as false" << endl;
auto-true\u count=0;
自动假计数=0;
对于每个(foo({/Users/User/QuizMaker/QuizMaker V2/sorular.txt”、“foo.txt”、“bar.txt”)、foo()、[&](const auto&i){
字符串回答;
答不上来;
如果(答案==“C”|答案==“C”){
当然,您可以从命令行接受参数。main的argc
和argv
(int-argc,char**argv)
成名是通向这些论点的途径。你问过如何编写一个以std::string
为参数的函数吗?我觉得我帮不了你什么。你应该只学习最基本的东西。非常感谢你的建议。我实际上也在学习它们。但是,在其中一个项目中,我需要做这样的工作塔夫。你对这个问题的解决方案是什么?我到底错过了什么?谢谢@specializt@oguzdumanoglu请不要理会专业的建议。在C++中,指针不是那么重要。对于数组,有<代码> STD::数组< /COD>,而不是数组类型<代码> STD::String(5)< /代码>,这是你现在拥有的。
auto true_count = 0;
auto false_count = 0;
for_each(foo({"/Users/User/QuizMaker/Quiz Maker V2/sorular.txt", "foo.txt", "bar.txt"}), foo(), [&](const auto& i) {
string answer;
cout << i << endl;
cin >> answer;
if(answer == "C" || answer == "c") {
cout << 1;
true_count++;
} else {
false_count++;
}
});
cout << "You answered "<< trueCount << " questions as true" << endl << "You answered " << falseCount << " questions as false" << endl;