Jump to content

Fixed length records: Difference between revisions

Added Go
m (→‎{{header|zkl}}: clean up)
(Added Go)
Line 339:
goback.
end program unblocking.</lang>
 
=={{header|Go}}==
<lang go>package main
 
import (
"fmt"
"log"
"os"
"os/exec"
)
 
func reverseBytes(bytes []byte) {
for i, j := 0, len(bytes)-1; i < j; i, j = i+1, j-1 {
bytes[i], bytes[j] = bytes[j], bytes[i]
}
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func main() {
in, err := os.Open("infile.dat")
check(err)
defer in.Close()
 
out, err := os.Create("outfile.dat")
check(err)
 
record := make([]byte, 80)
empty := make([]byte, 80)
for {
n, err := in.Read(record)
if err != nil {
if n == 0 {
break // EOF reached
} else {
out.Close()
log.Fatal(err)
}
}
reverseBytes(record)
out.Write(record)
copy(record, empty)
}
out.Close()
 
// Run dd from within program to write output.dat
// to standard output as normal text with newlines.
cmd := exec.Command("dd", "if=outfile.dat", "cbs=80", "conv=unblock")
bytes, err := cmd.Output()
check(err)
fmt.Println(string(bytes))
}</lang>
 
{{out}}
<pre>
8.........7.........6.........5.........4.........3.........2.........1...1 eniL
2 eniL
3 eniL
4 eniL
 
6 eniL
7 eniL
............................................................8 enil detnednI
NIGRAM TR 9 eniL
</pre>
 
'''Bonus round'''
 
<lang go>package main
 
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func block2text(inputFile, outputFile string) {
in, err := os.Open(inputFile)
check(err)
defer in.Close()
 
out, err := os.Create(outputFile)
check(err)
defer out.Close()
 
line := make([]byte, 64)
empty := make([]byte, 64)
for {
n, err := in.Read(line)
if err != nil {
if n == 0 {
break // EOF reached
} else {
log.Fatal(err)
}
}
str := string(line)
str = strings.TrimRight(str, " \000")
out.WriteString(str + "\n")
copy(line, empty)
}
}
 
func text2block(inputFile, outputFile string) {
in, err := os.Open(inputFile)
check(err)
defer in.Close()
 
out, err := os.Create(outputFile)
check(err)
defer out.Close()
 
scanner := bufio.NewScanner(in)
count := 0
for scanner.Scan() {
str := scanner.Text()
count++
le := len(str)
if le > 64 {
str = str[0:64]
} else if le < 64 {
str = fmt.Sprintf("%-64s", str)
}
out.WriteString(str)
}
if rem := count % 16; rem > 0 {
str := strings.Repeat(" ", (16-rem)*64)
out.WriteString(str)
}
}
 
func main() {
block2text("block.dat", "block.txt")
text2block("block.txt", "block2.dat")
}</lang>
 
=={{header|REXX}}==
9,490

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.