Быстрое считывание с++

303
14 марта 2018, 06:36

Здравствуйте, нужна помощь с написанием быстрого считывания из файла с помощью getchar_unlock(). В файле есть две строки не обязательно одинакового размера, сколько символов в каждой строке тоже не известно, нужно считать их в 2 массива или вектора, заранее спасибо за помощь.

Проблема: код считывает только 1 число, не знаю как сделать для всей строки

#include <iostream>
using namespace std;
bool read_int_unlocked(int & out)
{
    int c = getchar_unlocked();
    int x = 0;
    int neg = 0;
    for (; !('0'<=c && c<='9') && c != '-'; c = getchar_unlocked())
    {
        if (c == EOF)
            return false;
    }
    if (c == '-')
    {
        neg = 1;
        c = getchar_unlocked();
    }
    if (c == EOF)
        return false;
    for (; '0' <= c && c <= '9' ; c = getchar_unlocked())
    {
        x = x*10 + c - '0';
    }
    out = neg ? -x : x;
    return true;
}
int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int number;
    while(read_int_unlocked(number))
        std::cout << number << " ";   
    return 0;
}
Answer 1

#include <iostream> 
#include <vector> 
 
int read_int_unlocked(int & out) 
{ 
    int c = getchar_unlocked(); 
    int x = 0; 
    int neg = 0; 
     
    for (; !('0'<=c && c<='9') && c != '-'; c = getchar_unlocked()) 
    { 
        if (c == EOF) 
            return 0; 
    } 
    if (c == '-') 
    { 
        neg = 1; 
        c = getchar_unlocked(); 
    } 
    if (c == EOF) 
        return 0; 
    for (; '0' <= c && c <= '9' ; c = getchar_unlocked()) 
    { 
        x = x*10 + c - '0'; 
    } 
     
    out = neg ? -x : x; 
    if(c == '\n') return 2; 
    return 1; 
} 
 
int main() 
{ 
    freopen("input.txt", "r", stdin); 
    freopen("output.txt", "w", stdout); 
    std::vector<int> v1; 
    std::vector<int> v2; 
     
    int number; 
    int oldVec = 1; 
    bool cycle = true; 
    while(cycle){ 
        int res = read_int_unlocked(number); 
        if(res == 0) cycle = false; 
        if(res == 1) { 
            if(oldVec) v1.push_back(number); 
            else v2.push_back(number); 
        } 
        if(res == 2) { 
            if(oldVec) v1.push_back(number); 
            else v2.push_back(number); 
            oldVec = false; 
        } 
    } 
     
    for(int i = 0; i < v1.size(); i++) std::cout << v1[i] << " "; 
    std::cout << std::endl; 
    for(int i = 0; i < v2.size(); i++) std::cout << v2[i] << " "; 
    std::cout << std::endl; 
    return 0; 
}

READ ALSO
Передача параметра в поток

Передача параметра в поток

Есть классВ поток есть возможность передать параметр

258
Понять лексер на конечном автомате

Понять лексер на конечном автомате

Привет!Хочу понять как сделать лекссер на C++Анализировал лексеры на Питон

202
Как обрабатывать labels в C++ (CLR)

Как обрабатывать labels в C++ (CLR)

Доброе время сутокТребуется изменять значения каждого Label`a через N время, каким образом можно организовать систему обращения к данным полям...

198