Masukkan teks dari satu file, output ke yang lain


13

Tantangan:

Masukkan teks dari satu file dan output ke yang lain. Solusi harus merupakan fungsi kerja yang lengkap.

Catatan: Ini adalah pertanyaan . Harap jangan menanggapi pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini .


Code-trolling sedang dalam proses dihapus, sesuai dengan posisi resmi. Pertanyaan ini memiliki jumlah suara yang cukup dengan satu jawaban yang sangat tinggi. Hanya menerima sedikit lebih dari 50% "hapus" suara pada polling , tetapi hanya sekitar 8%, jadi saya menguncinya untuk signifikansi historis.
Gagang Pintu

Jawaban:


40

C

Inti dari memiliki beberapa bahasa pemrograman, adalah bahwa Anda perlu menggunakan alat yang tepat untuk pekerjaan itu.
Dalam hal ini, kami ingin menyalin byte dari satu file ke yang lain.
Sementara kita bisa menggunakan sesuatu yang mewah seperti bash atau ruby, atau jatuh ke kekuatan ASM, kita membutuhkan sesuatu yang cepat, bagus dengan bit dan cepat.
Pilihan yang jelas adalah C.
Cara paling sederhana untuk melakukannya adalah seperti ini:

#include <stdio.h>
#define THEORY FILE
#define AND *
#define PRACTICE myfile1
#define SOLUTIONS myfile2
#define ARE fopen
#define IMPORTANT "r"
#define BAD "w"
#define LOL fclose
#define PLEASE fgetc
#define HELP fputc
#define ME return
#define NEVER for
#define SURRENDER !=
#define VERY filename1
#define NOT filename2
#define _ 1

int copyFile(char* filename1, char* filename2)
{
  THEORY AND PRACTICE = ARE (VERY, IMPORTANT);
  THEORY AND SOLUTIONS = ARE (NOT, BAD);
  NEVER (;_;)
  {
    HELP(PLEASE(PRACTICE),SOLUTIONS);
  }
  ME _SURRENDER_;
}

Ini jahat karena akan membaca sampah pada hal-hal seperti cygwin, benar-benar Cina untuk pemula, akan menakuti dia ketika dia menyadari itu adalah panggilan untuk bantuan dan, jelas, karena C.


8
#define VERY filename1 #define NOT filename2
Joe Z.

1
Mengubah def untuk Anda. Saya menjaga mereka tetap pada deklarasi fungsi untuk LEBIH membingungkan!

8
Juga, jika Anda #define _ 1, Anda bisa membuatnya (;_;)dengan for-loop, agar terlihat seperti smiley.
Joe Z.

5
#define LOL fclosemembuat hari saya
thwd

1
#define LOL fclose, yang tidak pernah digunakan adalah karya saya.

28

SH

Saya suka kesederhanaan yang satu ini.

echo File1.txt > File2.txt

Benar-benar hanya berfungsi dengan baik jika File1.txtmengandung "File1.text" ...


Apa yang salah dengan itu?

4
@ user2509848 Ini menempatkan teks "File1.txt" ke dalam File2.txt, bukan isi aktualFile1.txt
syb0rg

Tapi ini sebenarnya tidak menyontek pertanyaan ...
jeremy

1
Bisa jadi sh karena tidak ada sesuatu yang spesifik bash.
Kaya

1
membuatnya ksh, ia harus mencari tahu di mana mendapatkannya

8

Autohotkey

WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s

Pertama-tama Anda harus membuka file di notepad atau editor teks lain yang membuat nama jendela dimulai dengan nama file. Kemudian ia menyalin isi file1 ke clipboard (secara harfiah, menggunakan ctrl+ c), dan menempelkannya ke file2, menimpa apa pun yang ada di dalamnya, dan menyimpannya.

Memecahkan masalah, tetapi dengan cara yang sangat tidak nyaman dan sangat tidak berguna. Mungkin akan lebih mudah dengan hanya menyalin dan menempel secara manual.


Luar biasa! Saya bertanya-tanya apa yang akan dipikirkan guru?

6

Seperti semua orang tahu, perl sangat baik untuk memanipulasi file. Kode ini akan menyalin konten dari satu file ke file lain, dan akan melakukannya dengan redundansi ekstra untuk ukuran yang baik.

#Good perl programs always start thusly
use strict;
use warnings;

my $input_file  = 'File1.txt';
my $output_file = 'File2.txt';
open(my $in, '<', $input_file) or die "Couldn't open $input_file $!";

my $full_line = "";
while (my $line = <$in>) {
    #Get each letter one at a time for safety, 
    foreach my $letter (split //, $line) {
        #You could and should add validity checks here
        $full_line .= $letter;

        #Get rid of output file if it exists!  You are replacing it with
        # new content so it's just wasting space.
        unlink $output_file if (-e $output_file);

        #Write data to new file
        open(my $out, '>', $output_file) or die "Couldn't open $output_file $!";
        print {$out} $full_line;
        close($out);
    }
}

Agar aman, ujilah ini pada file kecil pada awalnya. Setelah Anda yakin akan kebenarannya, Anda dapat memproduksinya untuk digunakan pada file yang sangat besar tanpa khawatir.


Apakah kode ini mengeluarkannya sekali, menghancurkan file, lalu mencoba mengeluarkannya lagi dari file keluaran pertama?

3
Lewat pertama menulis karakter pertama dari file lama ke file baru. Kedua kalinya melalui itu menghapus file baru dan menulis dua karakter pertama dari file lama ke file baru. Ketiga kalinya, tiga karakter, dll. Tidak hanya berlebihan, tetapi jika komputer Anda rusak Anda akan (mungkin) memiliki sebagian file!
dms

6

C #

Untuk mencapai ini, Anda harus memastikan untuk melakukan beberapa hal:

  1. Baca string dari file
  2. Unduh Microsoft File IO dan String Extension untuk Visual Studio
  3. Hapus virus dari string ("sanitize")
  4. Tulis file ke path
  5. Hapus dan muat ulang cache

Berikut kodenya:

static void CopyTextFile(string path1, string path2)
    {
        try
        {
            FileStream fs = new FileStream(path1, FileMode.OpenOrCreate); //open the FTP connection to file
            byte[] file = new byte[fs.Length];
            fs.Read(file, 0, file.Length);
            string makeFileSafe = Encoding.UTF32.GetString(file);

            using (var cli = new WebClient())
            {
                cli.DownloadData(new Uri("Microsoft .NET File IO and String Extension Package")); //get MS package
            }

            fs.Dispose();

            File.Create(path2);
            StreamReader read = new StreamReader(path2);
            read.Dispose(); //create and read file for good luck

            var sb = new StringBuilder();
            foreach (char c in path1.ToCharArray())
            {
                sb.Append(c);
            }

            string virusFreeString = sb.ToString(); //remove viruses from string

            File.WriteAllText(path2, virusFreeString);
            File.Delete(path1);
            File.WriteAllText(path1, virusFreeString); //refresh cache
        }
        catch
        { 
            //Don't worry, exceptions can be safely ignored
        }
    }

6

Dalam empat langkah sederhana:

  1. Cetak file. Anda dapat menggunakanlpr perintah untuk ini.
  2. Kirim hasil cetak ke layanan pemindaian. (Anda perlu ongkos kirim untuk ini).
  3. Layanan pemindaian akan memindai hasil cetak dan melakukan OCR untuk Anda.
  4. Unduh ke lokasi file yang sesuai.

Pekerjaan bagus menciptakan jawaban yang tidak berguna!

Apakah RFC1149 ini kompatibel?
Mark K Cowan

@ user2509848 Saya akan mengatakan pekerjaan yang baik dengan menciptakan pekerjaan yang tidak berguna alih-alih menjawab ...
Kiwy

4

Jawa

Banyak orang merasa berguna untuk mencoba menggunakan ekspresi reguler atau untuk mengevaluasi string untuk menyalinnya dari satu file ke yang lain, namun metode pemrograman itu ceroboh. Pertama kita menggunakan Java karena OOP memungkinkan lebih banyak transparansi dalam kode kita, dan kedua kita menggunakan antarmuka interaktif untuk menerima data dari file pertama dan menulisnya ke yang kedua.

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

public class WritingFiles{



 public static void main(String []args){
    File tJIAgeOhbWbVYdo = new File("File1.txt");
    Scanner jLLPsdluuuXYKWO = new Scanner(tJIAgeOhbWbVYdo);
    while(jLLPsdluuuXYKWO.hasNext())
    {
        MyCSHomework.fzPouRoBCHjsMrR();
        jLLPsdluuuXYKWO.next();
    }
 }
}

class MyCSHomework{
    Scanner jsvLfexmmYeqdUB = new Scanner(System.in);
    Writer kJPlXlLZvJdjAOs = new BufferedWriter(new OutputStreamWriter( new  FileOutputStream("File2.txt"), "utf-8"));
    String quhJAyWHGEFQLGW = "plea";
   String LHpkhqOtkEAxrlN = "f the file";
   String SLGXUfzgLtaJcZe = "e nex";
   String HKSaPJlOlUCKLun = "se";
   String VWUNvlwAWvghVpR = " ";
   String cBFJgwxycJiIrby = "input th";
   String ukRIWQrTPfqAbYd = "t word o";
   String  CMGlDwZOdgWZNTN =   quhJAyWHGEFQLGW+HKSaPJlOlUCKLun+VWUNvlwAWvghVpR+cBFJgwxycJiIrby+SLGXUfzgLtaJcZe+ukRIWQrTPfqAbYd+LHpkhqOtkEAxrlN;
    public static void fzPouRoBCHjsMrR(){
        System.out.println(CMGlDwZOdgWZNTN);
        kJPlXlLZvJdjAOs.write(jsvLfexmmYeqdUB.next());
    }



}

Secara teori (saya belum mengujinya) ini membuat pengguna secara manual memasukkan konten dari file pertama (kata demi kata) dan kemudian menulisnya ke file kedua. Tanggapan ini adalah permainan pada ambiguitas pertanyaan tentang apa artinya dengan "memasukkan teks dari satu file," dan nama-nama variabel gila (dihasilkan secara acak) hanya untuk kesenangan tambahan.


2
Saya sedang berpikir untuk membuat sesuatu yang mirip dengan ini ... tidak salah menafsirkan bagian input teks dari satu file , tetapi mengikuti pendekatan ahli matematika yang mengatakan saya telah mengurangi masalah menjadi yang sudah diselesaikan. => menangani input layar. Tidak datang dengan solusi yang baik ...
Kiruse

3

SH

Seperti yang ditunjukkan @Shingetsu, kita harus menggunakan alat yang tepat untuk pekerjaan yang tepat. Menyalin konten dari satu file ke file lain adalah masalah lama, dan alat terbaik untuk tugas manajemen file tersebut menggunakan shell.

Salah satu shell perintah bahwa setiap programmer harus membiasakan diri mereka dengan adalah umum tacperintah, digunakan untuk tac k isi file bersama-sama, satu demi satu. Sebagai kasus khusus ini, ketika hanya satu file dilewatkan di dalamnya hanya dimuntahkan apa adanya. Kami kemudian hanya mengarahkan output ke file yang sesuai:

tac inputfile.txt >outputfile.txt

Sederhana dan to-the-point, tidak ada trik!


2

Perl

Termasuk antivirus.

#!/usr/bin/perl -w
use strict;
use warnings;

print "Copy the text of the file here: (warning: I can't copy files with newlines):\n";
my $content = <STDIN>;

print "\n\nPlease wait, removing viruses...";
my @array = split(//,"$content");
my @tarray;

foreach my $item (@array)
{
    if ($item ne "V" && $item ne "I" && $item ne "R" && $item ne "U" && $item ne "S")
    {
        push(@tarray, $item);
    }

}

print "\n\nNow copy this into the target file:\n";

foreach my $item (@tarray){ print "$item"};

Sangat menarik, apakah itu hanya pura-pura memeriksa virus, atau apakah itu benar-benar melakukannya?

1
Tidak, itu hanya menghilangkan huruf V, I, R, U, S dari file.
craftext

Oh Karena Anda mengatakan "menghapus virus", mungkin Anda harus menghapus 'E' juga.

2
Itu benar. Tetapi jika Anda benar-benar ingin menghapus virus, ada modul CPAN untuk melakukannya: search.cpan.org/~converter/Mail-ClamAV-0.29 .
craftext

2

Windows Batch

(karena Anda harus memiliki bahasa yang seharusnya "mati" ini ;-)

@echo off
setlocal enabledelayedexpansion
for %%I in ('type %1') do set this=!this!%%I
echo !this!>%2 2>nul

Anda cukup menyebutnya sebagai copy.bat file1.txt file2.txt(atau file apa pun yang Anda inginkan)

Kalau saja itu akan membuat garis istirahat ...


setlocal enabledelayedexpansiondan set thisline=!thisline!%%Ihanya berfungsi di Windows CMD. Dalam DOS harus bekerja sederhanaset thisline=%thisline%%%I
AMK

Saya memperbarui judul.
Isiah Meadows

2

Linq

Efisiensi tidak penting, kebenaran itu. Menulis dalam gaya fungsional menghasilkan kode yang lebih jelas dan lebih rentan kesalahan. Jika kinerja ternyata menjadi masalah, baris ToArray () terakhir dapat dihilangkan. Lagipula, lebih baik malas.

public void CopyFile(string input, string output)
{
    Enumerable
        .Range(0, File.ReadAllBytes(input).Length)
        .Select(i => new { i = i, b = File.ReadAllBytes(input)[i] })
        .Select(ib => {
            using (var f = File.Open(output, ib.i == 0 ? FileMode.Create : FileMode.Append))
                f.Write(new byte[] { ib.b }, 0, 1);
            return ib; })
        .ToArray();
}

2

Smalltalk

Ada perpustakaan yang belum diport ke beberapa dialek Smalltalk (Visualworks, Gemstone Squeak / Pharo, ...) bernama Xtreams yang membuat tugas ini lebih mudah.

FileStream akan sesederhana 'foo' asFilename readingdan 'bar' asFilename writingmisalnya dalam Visualworks, tetapi khusus dialek.
Untuk alasan ini saya mendemonstrasikan algoritma dengan dialek internal stream netral sebagai gantinya.
Ide yang bagus adalah memproses setiap byte kode dalam urutan yang meningkat:

| input |
input := 'Hello world' asByteArray reading.
^((ByteArray new writing)
    write: ((0 to: 255) inject: ByteArray new reading into: [:outputSoFar :code |
        | nextOutput |
        nextOutput := ByteArray new writing.
        ((input += 0; selecting: [:c | c <= code]) ending: code inclusive: true) slicing do: [:subStream |
            | positionable |
            positionable := subStream positioning.
            nextOutput write: (outputSoFar limiting: (positionable ending: code) rest size).
            nextOutput write: (positionable += 0; selecting: [:c | c = code])].
        nextOutput conclusion reading]);
    conclusion) asString

Tentu saja, ini juga memungkinkan untuk diproses dalam urutan acak, tetapi saya khawatir itu membuat kode ini agak terlalu kompak:

| input output |
input := 'Hello world' asByteArray reading.
output := ByteArray new writing.
(0 to: 255) asArray shuffled do: [:code |
        output += 0.
        (input += 0; ending: code inclusive: true) slicing do: [:subStream |
            | positionable |
            positionable := subStream positioning.
            output ++ (positionable += 0; rejecting: [:c | c = code]) rest size.
            output write: (positionable += 0; selecting: [:c | c = code])]].
^output conclusion asString

EDIT

Ah bodohnya aku, aku tidak melihat solusi log2:

| input output |
input := 'Hello world' asByteArray reading.
(output := ByteArray new writing) write: (input collecting: [:e | 0]).
output := (0 to: 7) asArray shuffled inject: output into: [:outputSoFar :bit |
        (ByteArray new writing)
            write:
                (((input += 0; collecting: [:e | e >> bit bitAnd: 1]) interleaving: outputSoFar conclusion reading) 
                    transforming: [ :in :out | out put: in get << bit + in get]);
            yourself].
^output conclusion asString

1

PESTA

pada terminal # 1 dengan IP, 192.168.1.2

nc -l 8080 | gpg -d > mydocument.docx

pada terminal # 2 dengan IP, 192.168.1.3

gpg -c mydocument.docx | nc 192.168.1.2 8080

Ini akan mengenkripsi dan mengirim mydocument.docx, menggunakan ncdan gpg, ke terminal # 1 Anda harus mengetikkan kata sandi pada terminal # 2, kemudian pada terminal # 1


Bisakah Anda menandai kodenya?

Saya seorang pemula, tetapi begini, nc -l 8080 memberitahu netcat untuk mendengarkan pada port 8080. apa pun yang dikirim ke 192.168.1.2:8080 akan muncul di terminal # 1 di terminal # 2, gpg mengenkripsi mydocument.docx, dan menyalurkannya ke netcat. nc 192.168.1.2 8080 mengirimkan mydocument.docx terenkripsi ke terminal # 1 ketika # 1 menerimanya, ia tidak mengenkripsi itu dengan gpg -d , dan menyimpan saya
Fews1932

1

C ++

Ini agak berdasarkan jawaban Shingetsu , tapi aku tidak bisa menolak. Ini berfungsi penuh, tetapi tidak ada siswa yang akan menyerahkannya kepada guru mereka (saya harap). Jika mereka bersedia menganalisis kode, mereka akan dapat memecahkan masalah mereka:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define SOLVE ifs
#define IT >>
#define YOURSELF ofs

ifstream& operator IT(ifstream& ifs, ofstream& ofs) {
  string s;
  SOLVE IT s;
  YOURSELF << s;
  return ifs;
}

void output(ofstream& ofs, ifstream& ifs) {
  while (ifs) {
    SOLVE IT YOURSELF;
    ofs << ' ';
  }
}

int main() try {

  ofstream ofs("out.txt");
  ifstream ifs("in.txt");

  output(ofs, ifs);

  return 0;
}
catch (exception& e) {
  cerr << "Error: " << e.what() << endl;
  return 1;
}
catch (...) {
  cerr << "Unknown error.\n";
  return 2;
}

3
-1 (tidak juga), tidak cukup JQuery. Juga terlalu banyak memeriksa kesalahan. Saya pikir Anda bahkan menutup file! Aduh

Saya bisa tahu JQuery akan datang!

1

Python

Input teks dari file1.txt dan output ke file2.txt

Lengkap dan "berfungsi". Tidak ada yang mengatakan apa pun tentang menulis input apa adanya. Semua karakter input muncul di output. "getchar" adalah bagian trolling.

from random import choice as getchar

f1 = open("file1.txt")
s1 = []
for line in f1:
    for char in line:
        s1.append(str(char))
s2 = ''
while len(s1) > 0:
    x = getchar(s1)
    s2 += x
    s1.remove(x)
f2 = open("file2.txt" , 'w')
f2.write(s2)

1

Mathematica, 44 karakter

Penerapan

f = (BinaryWrite[#2, BinaryReadList@#]; Close@#2) &

Eksekusi

f["one file", "another"]

Memeriksa

check = Import[StringJoin["!diff \"", #, "\" \"", #2, "\" 2>&1"], "Text"] &;
check["one file", "another"]


Dimana trollnya? Saya tidak tahu Mathematica.

Itu jawaban yang sangat serius.
Chris Degnen

Oh Apakah Anda membaca aturan untuk Kode trolling? codegolf.stackexchange.com/tags/code-trolling/info

Tidak persis, tapi jawabannya tidak masuk akal karena saya bisa menggunakan Mathematica 's CopyFilefungsi.
Chris Degnen

1

DELPHI / PASCAL (salin dari f1.txt ke f2.txt)

program t;

{$APPTYPE CONSOLE}

uses
  classes;

var a : TStringlist;
begin
   a:=TStringlist.Create;
   a.LoadFromFile('e:\f1.txt');
   a.SaveToFile('e:\f2.txt');
   a.Free;
end.

1

MASM

Saya jelas bukan pakar perakitan, tetapi di bawah ini cuplikan kecil saya:

include \masm32\include\masm32rt.inc

.code

start:
call main
inkey
exit

main proc
LOCAL hFile :DWORD  
LOCAL bwrt  :DWORD 
LOCAL cloc  :DWORD 
LOCAL flen  :DWORD  
LOCAL hMem  :DWORD  

.if rv(exist,"out.txt") != 0  
  test fdelete("out.txt"), eax 
.endif

mov hFile, fopen("source.txt")
mov flen, fsize(hFile)
mov hMem, alloc(flen)   
mov bwrt, fread(hFile,hMem,flen)  
fclose hFile   

invoke StripLF,hMem

mov hFile, fcreate("out.txt") 
mov bwrt, fwrite(hFile,hMem,flen)   
fclose hFile   

free hMem   

ret

main endp
end start

1

C ++

Apakah Anda memperhatikan bit "fungsi lengkap, berfungsi"? Bagaimanapun, inilah jawaban saya:

#include <stdlib.h>
int main(void)
{
  system("echo < input > dest");
}

1

Lua

io.read()

Jalankan dengan file input yang berisi text from one file and output it to another. Solution should be a complete, working function..


2
Orang suatu hari akan memiliki cukup jawaban ini :( Saya sudah punya.
Vereos

1

PHP

function copyFile($input, $output) 
{
    return file_put_contents($output, file_get_contents($input));
}

1

#! / bin / sh

contents=`< $1` ; echo "$contents" > $2

Terlihat masuk akal, tetapi agak tidak efisien jika file berukuran besar.

Bekerja dengan baik pada file ASCII kecuali ketika file input berisi -n, -eatau -E. (Karena ini ditafsirkan sebagai argumen oleh echo.)

Tidak menghasilkan output yang benar untuk semua (sebagian) file biner.

(Menggunakan di printf "%s" "$contents" > outputbawah /bin/bashberfungsi sedikit lebih baik, tapi itu masih menjatuhkan byte NULL.)

Oh dan tentu saja itu tidak berfungsi untuk filenames_containing_spaces. Tetapi file seperti itu ilegal di bawah UNIX% 20policy.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.