Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_File_Loops_Input_Ifstream - Fatal编程技术网

C++ 如何在C++;?

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

我想做的基本上是写一个函数,它把一个参数作为一个文件名,如果有多个文件,它会把文件名作为一个参数,它应该用一个函数重复这样做。我该怎么做? 谢谢

Txt文件是这样的 例如,sorular.txt:

//世界上最拥挤的国家是哪个?
//中国
//美国
//德国
//澳大利亚
//中国

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;