Bir dosyadan metin girin, başka bir dosyaya gönderin


13

Meydan okuma:

Bir dosyadan metin girin ve başka bir dosyaya gönderin. Çözüm tam, çalışan bir işlev olmalıdır.

Not: Bu bir sorusudur. Lütfen soruyu ve / veya cevapları ciddiye almayın. Daha fazla bilgi burada .


Kod trollemesi, resmi duruşa göre kaldırılma sürecindedir . Bu sorunun son derece yüksek oy alan bir cevabı olan adil bir oyu var. Ankette % 50'nin biraz üzerinde "silme" oyu aldı , ancak sadece% 8 oranında, bu yüzden tarihi önem için kilitliyorum.
Kapı tokmağı

Yanıtlar:


40

C

Birden fazla programlama diline sahip olmanın asıl amacı, iş için doğru aracı kullanmanız gerektiğidir.
Bu durumda, baytları bir dosyadan diğerine kopyalamak istiyoruz.
Bash veya ruby ​​gibi süslü bir şey kullanabilir veya ASM'nin gücüne düşebiliriz, ancak hızlı, iyi bit ve hızlı bir şeye ihtiyacımız var.
Açık seçim C'dir
. Bunu yapmanın en basit yolu şöyle olacaktır:

#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_;
}

Bu şeytani çünkü cygwin gibi şeylerde çöp okuyacak, yeni başlayanlar için tamamen çince olacak, bir yardım çağrısı olduğunu fark ettiğinde onu korkutacak ve tabii ki C.


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

1
Bu kusurları senin için değiştirdim. DAHA FAZLA karışıklık için işlev bildiriminde aynı tuttum!

8
Ayrıca, eğer #define _ 1, (;_;)bir surat gibi görünmesini sağlamak için for-loop ile yapabilirsiniz.
Joe Z.

5
#define LOL fclosegünümü yaptı
thwd

1
#define LOL fcloseama hiç kullanılmamış olan benim şaheserim.

28

sh

Bunun basitliğini seviyorum.

echo File1.txt > File2.txt

Gerçekten sadece File1.txt"File1.text" içeriyorsa düzgün çalışır ...


Sorun nedir?

4
@ user2509848 "File1.txt" metnini File2.txtgerçek içeriğine değil, içine koyarFile1.txt
syb0rg

Ama bu aslında soruyu
aldatmıyor

1
Bash belirli bir şey yok gibi sh olabilir.
Kaya

1
ksh olun, nereden alacağını bulmak zorunda

8

AutoHotKey

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

Önce dosyaları not defterinde veya pencere adlarının dosya adlarıyla başlamasını sağlayan başka bir metin düzenleyicide açmalısınız. Daha sonra file1'in içeriğini panoya kopyalar (kelimenin tam anlamıyla ctrl+ kullanarak c) ve içinde mevcut olan herhangi bir şeyin üzerine yazarak file2'ye yapıştırır ve kaydeder.

Sorunu çözer, ancak çok rahatsız edici ve oldukça işe yaramaz bir şekilde. Muhtemelen elle kopyalayıp yapıştırmak daha kolay olacaktır.


Mükemmel! Acaba öğretmen ne düşünürdü?

6

Herkesin bildiği gibi, perl dosyaları manipüle etmek için çok iyidir. Bu kod, bir dosyanın içeriğini diğerine kopyalar ve bunu iyi bir önlem için fazladan yedekleme ile yapar.

#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);
    }
}

Güvende olmak için, önce bunu küçük bir dosyada test edin. Doğruluğundan emin olduktan sonra, endişelenmeden çok büyük dosyalarda kullanmak için üretime alabilirsiniz.


Bu kod bir kez çıktı verir, dosyayı yok eder, sonra ilk çıktı dosyasından tekrar çıktısını almayı dener mi?

3
İçinden ilk geçiş eski dosyanın ilk karakterini yeni dosyaya yazar. İkinci kez yeni dosyayı siler ve eski dosyanın ilk iki karakterini yeni dosyaya yazar. Üçüncü kez, üç karakter vs.
dms

6

C #

Bunu başarmak için birkaç şey yaptığınızdan emin olmalısınız:

  1. Dizeden dosyadan okuma
  2. Visual Studio için Microsoft Dosya G / Ç ve Dize Uzantısını İndirin
  3. Virüsleri dizeden kaldırın ("sanitize")
  4. Dosyayı yola yaz
  5. Önbelleği sil ve yeniden yükle

İşte kod:

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

Dört basit adımda:

  1. Dosyayı yazdırın. Bunun için lprkomutu kullanabilirsiniz .
  2. Çıktıları bir tarama servisine postalayın. (Bunun için postaya ihtiyacınız olacak).
  3. Tarama hizmeti çıktıları tarar ve sizin için OCR işlemi yapar.
  4. Uygun dosya konumuna indirin.

Yararsız bir cevap oluşturmak iyi iş çıkardı!

Bu RFC1149 uyumlu mu?
Mark K Cowan

@ user2509848 Ben cevap yerine işe yaramaz iş oluşturma iyi iş söyleyebilirim ...
Kiwy

4

Java

Birçok kişi normal ifadeleri kullanmaya veya dizeleri bir dosyadan diğerine kopyalamak için değerlendirmeyi yararlı bulmaktadır, ancak bu programlama yöntemi özensizdir. İlk önce Java kullanıyoruz, çünkü OOP kodumuzda daha fazla şeffaflık sağlıyor ve ikincisi, ilk dosyadan veri almak ve ikincisine yazmak için etkileşimli bir arayüz kullanıyoruz.

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());
    }



}

Teoride (test etmedim) bu, kullanıcının ilk dosyanın içeriğini (kelime kelime) manuel olarak girmesini sağlar ve daha sonra ikinci dosyaya yazar. Bu yanıt, "bir dosyadan metin girme" ile sorunun ne anlama geldiğine dair bir oyundur ve çılgın değişken adları (rastgele oluşturulmuş) sadece biraz daha eğlenceliydi.


2
Buna benzer bir şey yapmayı düşünüyordum ... Parça giriş metnini bir dosyayı yanlış yorumlamamak , ama bir matematikçinin yaklaşımı takip ederek sorunu zaten çözülmüş bir dosyaya indirgiyorum . => ekran girişi işleme. Yine de iyi bir çözüm
bulamadık

3

sh

@Shingetsu'nun işaret ettiği gibi, doğru iş için doğru aracı kullanmak gerekir. İçeriği bir dosyadan diğerine kopyalamak eski bir sorundur ve bu tür dosya yönetimi görevleri için en iyi araç kabuğu kullanmaktır.

Her programcı ile kendilerini tanımak zorunda olduğu bir kabuk komutu yaygındır taciçin kullanılan komut, tac birlikte dosyaların k içerik, birbiri ardına. Bunun özel bir durumu olarak, sadece bir dosya geçirildiğinde tekrar olduğu gibi tükürür. Daha sonra çıktıyı uygun dosyaya yönlendiririz:

tac inputfile.txt >outputfile.txt

Basit ve noktaya, hile yok!


2

Perl

Antivirüs dahil.

#!/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"};

Çok ilginç, sadece virüsleri kontrol ediyormuş gibi mi yapıyor, yoksa gerçekten yapıyor mu?

1
Hayır, yalnızca V, I, R, U, S harflerini dosyadan kaldırır.
craftext

Ah. "Virüs temizleme" dediğinden, belki 'E' yi de kaldırmalısınız.

2
Bu doğru. Ancak virüsleri gerçekten kaldırmak istiyorsanız, bunu yapmak için bir CPAN modülü vardır: search.cpan.org/~converter/Mail-ClamAV-0.29 .
craftext

2

Windows Toplu İş

(çünkü bu sözde "ölü" dile sahip olmalısınız ;-)

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

Buna sadece copy.bat file1.txt file2.txt(ya da istediğiniz dosyaları)

Keşke satır sonlarını tutarsa ​​...


setlocal enabledelayedexpansionve set thisline=!thisline!%%Iyalnızca Windows CMD'de çalışır. DOS'ta basit çalışmalıset thisline=%thisline%%%I
AMK

Başlığı güncelledim.
Isiah Meadows

2

linq

Verimlilik önemli değil, doğruluk önemlidir. İşlevsel bir tarzda yazmak daha net ve daha az hataya açık kodla sonuçlanır. Performansın bir sorun olduğu ortaya çıkarsa, son ToArray () satırı atlanabilir. Zaten tembel olmak daha iyi.

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

Bu görevi daha kolay hale getiren Xtreams adlı birkaç Smalltalk lehçesine (Visualworks, Gemstone Squeak / Pharo, ...) taşınan bir kütüphane var .

FileStream olarak basit olarak döneceği 'foo' asFilename readingve 'bar' asFilename writingVisualWorks örneğin, ama lehçesi özeldir.
Bu nedenle bunun yerine lehçe nötr iç akışları olan algoritmayı gösteririm.
Her bayt kodunu artan sırada işlemek iyi bir fikir olabilir:

| 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

Tabii ki, rastgele sırayla işlemek de mümkün, ancak kodu biraz fazla kompakt hale getirmekten korkuyorum:

| 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

DÜZENLE

Ah aptal bana, log2 çözümünü görmedim:

| 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

BASH

IP ile 1 numaralı terminalde, 192.168.1.2

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

IP ile terminal # 2'de, 192.168.1.3

gpg -c mydocument.docx | nc 192.168.1.2 8080

Bu, # 1 terminaline ve mydocument.docxkullanarak şifreleyecek ve gönderecek. 2 numaralı terminalde, sonra 1 numaralı terminalde şifreyi yazmanız gerekecekncgpg


Kodu işaretleyebilir misiniz?

Bir acemi, ama işte gidiyor, nc -l 8080 netcat'e 8080 bağlantı noktasını dinlemesini söyler. 192.168.1.2:8080'e gönderilen her şey terminal # 2'deki # 1 terminalinde görünecektir, gpg mydocument.docx'i şifreler ve netcat'in. nc 192.168.1.2 8080 , # 1 alındığında şifrelenmiş mydocument.docx dosyasını # 1 terminaline gönderir, gpg -d ile
şifresini çözer

1

C ++

Bu biraz Shingetsu'nun cevabına dayanıyor , ama dayanamadım. Tamamen işliyor, ancak hiçbir öğrenci bunu öğretmenlerine sunmayacaktı (umarım). Kodu analiz etmek istiyorlarsa, problemlerini çözebilirler:

#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 (gerçekten değil), yeterli JQuery. Ayrıca çok fazla hata kontrolü. Sanırım dosyayı bile kapattın! Gawd.

JQuery'nin geleceğini biliyordum!

1

piton

File1.txt dosyasından metin girer ve dosya2.txt dosyasına çıkarır

Tam ve "çalışıyor". Hiç kimse girişi olduğu gibi yazmak hakkında bir şey söylemedi. Tüm giriş karakterleri çıktıda görünür. "getchar" trolling kısmıdır.

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

uygulama

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

infaz

f["one file", "another"]

Kontrol

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


Trol nerede? Mathematica'yı tanımıyorum.

Bu gülünç derecede ciddi bir cevap.
Chris Degnen

Ah. Kod trolling kurallarını okudunuz mu? codegolf.stackexchange.com/tags/code-trolling/info

Ben kullanmış olabilir çünkü Tam olarak değil ama cevap saçma Mathematica 'nın CopyFilefonksiyonu.
Chris Degnen

1

DELPHI / PASCAL (f1.txt dosyasından f2.txt dosyasına kopyala)

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

Kesinlikle bir montaj uzmanı değilim, ama aşağıda küçük snippet'im:

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 ++

"Tam, çalışan fonksiyon" bitini fark ettiniz mi? Her neyse, işte cevabım:

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

1

Lua

io.read()

İçeren bir girdi dosyası ile çalıştırın text from one file and output it to another. Solution should be a complete, working function..


2
Bir gün insanlar bu cevaplara yetecek kadar sahip olacak :( Zaten vardı.
Vereos

1

PHP

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

1

#! / Bin / sh

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

Makul görünüyor, ancak dosya büyükse verimsiz görünüyor.

Giriş dosyası içerdiğinde dışında ASCII dosyaları cezası Works -n, -eya -E. (Çünkü bunlar tarafından argüman olarak yorumlanır echo.)

Tüm (çoğu) ikili dosyalar için doğru çıktı üretmez.

(Kullanma printf "%s" "$contents" > outputaltında /bin/bashbiraz daha iyi işler, ama hala BOŞ bayt düşer.)

Ve tabii ki dosya_konusu_uzayları için çalışmaz. Ancak bu tür dosyalar zaten UNIX% 20policy altında yasadışıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.