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):
stdin
, std::cin
, input
,
System.in
) — datu plūsma, no kuras programma nolasa ievaddatus.stdout
, std::cout
, output
,
System.out
) — datu plūsma, kurā programma ieraksta izvaddatus.stderr
, std::cerr
/std::clog
, errout
,
System.err
) — datu plūsma, kurā programma izvada kļūdas un diagnostiskos paziņojumus. To var lietot programmu atkļūdošanai.Vairāk par standarta ievadu/izvadu var izlasīt Wikipedia.
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.
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a + b);
}
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
program Sum;
var
a, b: integer;
begin
readln(a, b);
writeln(a + b);
end.
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();
}
}
a, b = map(int, input().split())
print(a + b)
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.
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.
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:
std::ios::sync_with_stdio(false);
programmas
sākumā, ja nav paredzēts lietot C (printf()
/scanf()
) funkcijas.std::cin.tie(NULL);
programmas sākumā, ja uzdevums nav interaktīvs.'\n'
, nevis std::endl
, ja uzdevums nav interaktīvs.Scanner
vietā ieteicams lietot StringTokenizer
vai StreamTokenizer
, kopā ar BufferedReader
.PrintWriter
, ieteicams izvadīt vērtības pa vienai un nelietot PrintWriter.printf()
funkciju.Lielu datu ievadu var izmēģināt CodeChef INTEST uzdevumā.