Standarta ievads un izvads

Ievads

Par standarta ievadu/izvadu sauc datu plūsmas, kas, programmai sākot darbu, jau ir atvērtas un gatavas darbam. Tas atšķiras no datņu plūsmām, kas programmētājam ir jāatver pašam, norādot datnes nosaukumu un ceļu. To, ar ko programmas standarta ievads/izvads ir saistīti (datnes, starpprocesu saziņa utt.), nosaka vide, kurā programma tiek palaista, un veids, kā tas tiek darīts. Pašai programmai par to nav jāuztraucas — pietiek zināt, ka ar standarta ievadu/izvadu var strādāt kā ar parastām datu plūsmām.

Pastāv trīs standarta datu plūsmas (iekavās doti plūsmu nosaukumi C, C++, Pascal, Java):

Vairāk par standarta ievadu/izvadu var izlasīt Wikipedia.

Programmu piemēri

Tālāk ir doti piemēri darbam ar standarta plūsmām dažādās programmēšanas valodās (bez kļūdu apstrādes). Uzdevums ir nolasīt divus skaitļus un izvadīt to summu.

C

#include <stdio.h>

int main()
{
    int a, b;

    scanf("%d %d", &a, &b);
    printf("%d\n", a + b);
}

C++

#include <iostream>

using namespace std;

int main()
{
    int a, b;

    cin >> a >> b;
    cout << a + b << endl;
}

Pascal

program Sum;

var
    a, b: integer;

begin
    readln(a, b);
    writeln(a + b);
end.

Java

import java.io.*;
import java.util.*;

public class Sum {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        int a = in.nextInt(), b = in.nextInt();
        out.println(a + b);

        out.flush();                
    }
}

Python 3

a, b = map(int, input().split())
print(a + b)

Go

package main

import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    var a, b int

    in := bufio.NewReader(os.Stdin)
    fmt.Fscanf(in, "%d %d\n", &a, &b)
    fmt.Printf("%d\n", a + b)

}

Piemērs izmanto bufio pakotni ievada buferizācijai.

Darbs komandrindā

Piezīme: Windows operētājsistēmā komandrindas logu var atvērt, aizejot uz risinājuma mapi, spiežot Shift+labā peles poga uz mapes fona un uzvēloties "Open command window here".

Piezīme: Unix-veidīgu operētājsistēmu lietotājiem, kā arī PowerShell lietotājiem piemēros ir jāaizvieto prog ar ./prog.

Palaižot programmu komandrindā, programmu standarta plūsmas pēc noklusējuma tiek piesaistītas attiecīgajam terminālim. Lietotājs var ievadīt datus programmā un iegut rezultātus. Piemēram:

█ prog     ⇦ Lietotājs ievada programmas nosaukumu "prog" un palaiž programmu ar Enter
1 2        ⇦ Lietotājs ievada datus (kopā ar Enter)
3          ⇦ Programma izvada atbildi
█

Standarta ievadu/izvadu var novirzīt datnēs. Piemēram, var piesaistīt programmas standarta ievadu datnei:

█ prog < in.txt  ⇦ Lietotājs palaiž programmu un standarta ievadā iedod in.txt (kas satur "1 2")
3                ⇦ Programma nolasa ievadu un izvada rezultātu
█
Kā arī var piesaistīt datnes vienlaikus gan standarta ievadam, gan izvadam:
█ prog < in.txt > out.txt  ⇦ Lietotājs palaiž programmu, ievadā iedod in.txt, bet izvadu novirza out.txt
█                          ⇦ Terminālī nekas netiek izvadīts, bet out.txt tagad satur "3"

Vairāk par pāradresāciju var izlasīt Wikipedia.

Veiktspējas uzlabojumi

Piezīme: šajā nodaļā dotie padomi ir paredzēti pieredzējušiem lietotājiem.

Ja ievaddatu vai izvaddatu apjoms ir ļoti liels, ievads un izvads var aizņemt ievērojamu laiku. Ir daži veidi, kā to samazināt:

Lielu datu ievadu var izmēģināt CodeChef INTEST uzdevumā.