Введите текст из одного файла, выведите его в другой


13

Соревнование:

Введите текст из одного файла и выведите его в другой. Решение должно быть полной, работающей функцией.

Примечание: это вопрос . Пожалуйста, не воспринимайте вопрос и / или ответы всерьез. Больше информации здесь .


Код-троллинг находится в процессе удаления согласно официальной позиции. Этот вопрос имеет достаточное количество голосов с одним чрезвычайно высоко проголосовавшим ответом. Он получил чуть более 50% «исключенных» голосов в опросе , но только примерно на 8%, поэтому я фиксирую его на историческом значении.
дверная ручка

Ответы:


40

С

Весь смысл наличия нескольких языков программирования в том, что вам нужно использовать правильный инструмент для работы.
В этом случае мы хотим скопировать байты из одного файла в другой.
В то время как мы могли бы использовать что-то причудливое, например bash или ruby, или воспользоваться мощью ASM, нам нужно что-то быстрое, хорошее с битами и быстрое.
Очевидный выбор - C.
Самый простой способ сделать это был бы так:

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

Это зло, потому что он будет читать мусор на таких вещах, как cygwin, полностью китайский для новичка, напугает его, когда он поймет, что это зов о помощи, и, очевидно, потому что C.


8
#define VERY filename1 #define NOT filename2
Джо З.

1
Изменил эти определения для вас. Я оставил их такими же в объявлении функции для БОЛЬШЕ путаницы!

8
Кроме того, если вы #define _ 1можете сделать (;_;)цикл for, чтобы он выглядел как смайлик.
Джо З.

5
#define LOL fcloseсделал мой день
thwd

1
#define LOL fclose, который никогда не используется, хотя мой шедевр.

28

ш

Мне нравится простота этого.

echo File1.txt > File2.txt

Действительно работает правильно только если File1.txtсодержит "File1.text" ...


Что с этим не так?

4
@ user2509848 Вставляет текст «File1.txt» File2.txt, а не фактическое содержимоеFile1.txt
syb0rg

Но на самом деле это не обманывает вопрос ...
Джереми

1
С таким же успехом может быть sh, так как нет ничего специфичного для bash.
Кая

1
сделай это ksh, ему придется выяснить, где его взять

8

AutoHotKey

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

Сначала вы должны открыть файлы в блокноте или другом текстовом редакторе, в котором имена окон начинаются с имен файлов. Затем он копирует содержимое файла1 в буфер обмена (буквально, используя ctrl+c ) и вставляет его в файл file2, перезаписывая все, что в нем находится, и сохраняет.

Решает проблему, но очень неудобно и довольно бесполезно. Вероятно, проще было бы просто скопировать и вставить вручную.


Отлично! Интересно, что бы подумал учитель?

6

Как все знают, Perl очень хорош для манипулирования файлами. Этот код будет копировать содержимое одного файла в другой и будет делать это с дополнительной избыточностью для хорошей меры.

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

Чтобы быть в безопасности, сначала проверьте это на небольшом файле. Убедившись в его правильности, вы можете без проблем запустить его в производство для использования с очень большими файлами.


Этот код выводит его один раз, уничтожает файл, а затем пытается снова вывести его из первого выходного файла?

3
При первом прохождении он записывает первый символ старого файла в новый файл. Во второй раз он удаляет новый файл и записывает первые два символа старого файла в новый файл. Третий раз, три символа и т. Д. И т. Д. Мало того, что это избыточно, но и в случае сбоя компьютера у вас (возможно) будет частичный файл!
ДМС

6

C #

Чтобы достичь этого, вы должны сделать несколько вещей:

  1. Читать строку из файла
  2. Скачать Microsoft File IO и расширение String для Visual Studio
  3. Удалить вирусы из строки («дезинфицировать»)
  4. Записать файл в путь
  5. Удалить и перезагрузить кеш

Вот код:

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

В четыре простых шага:

  1. Распечатать файл. Вы можете использоватьlpr команду для этого.
  2. Отправьте распечатки по почте в службу сканирования. (Вам понадобятся почтовые расходы для этого).
  3. Служба сканирования отсканирует распечатки и сделает распознавание для вас.
  4. Загрузите в соответствующий файл.

Хорошая работа, создающая бесполезный ответ!

Это RFC1149 совместимо?
Марк К Коуэн

@ user2509848 Я бы сказал, хорошая работа, создавая бесполезную работу вместо ответа ...
Kiwy

4

Джава

Многие люди считают полезным пытаться использовать регулярные выражения или оценивать строки, чтобы скопировать их из одного файла в другой, однако этот метод программирования небрежен. Во-первых, мы используем Java, потому что ООП обеспечивает большую прозрачность в нашем коде, а во-вторых, мы используем интерактивный интерфейс для получения данных из первого файла и записи их во второй.

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



}

Теоретически (я не проверял) это заставляет пользователя вручную вводить содержимое первого файла (слово в слово), а затем записывает его во второй файл. Этот ответ является игрой на неоднозначность вопроса о том, что означает «ввод текста из одного файла», и сумасшедшие имена переменных (генерируемые случайным образом) были просто для дополнительного удовольствия.


2
Я думал о том, чтобы сделать что-то похожее на это ... не неправильно истолковывая вводимый текст из одного файла , а следуя подходу математика, который говорит: что я сократил проблему до уже решенной. => обработка ввода на экране. Хотя не
нашел

3

ш

Как указывал @Shingetsu, для правильной работы нужно использовать правильный инструмент. Копирование содержимого из одного файла в другой - старая проблема, и лучшим инструментом для таких задач управления файлами является использование оболочки.

Одна команда оболочки, с которой каждый программист должен ознакомиться, - это обычная tacкоманда, используемая для синхронизации содержимого файлов, один за другим. В качестве особого случая, когда передается только один файл, он просто выплевывается как есть. Затем мы просто перенаправляем вывод в соответствующий файл:

tac inputfile.txt >outputfile.txt

Просто и понятно, никаких хитростей!


2

Perl

Антивирус включен.

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

Очень интересно, он просто делает вид, что проверяет на вирусы, или он действительно это делает?

1
Нет, он удаляет только буквы V, I, R, U, S из файла.
craftext

Ой. Поскольку вы говорите «удаление вирусов», возможно, вам следует удалить и «E».

2
Это правда. Но если вы действительно хотите удалить вирусы, для этого есть модуль CPAN: search.cpan.org/~converter/Mail-ClamAV-0.29 .
craftext

2

Пакет Windows

(потому что у тебя должен быть этот якобы «мертвый» язык ;-)

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

Вы просто называете это как copy.bat file1.txt file2.txt (или любые файлы, которые вы хотите)

Если бы только это сохранило разрывы строк ...


setlocal enabledelayedexpansionи set thisline=!thisline!%%Iработает только в Windows CMD. В DOS должна работать простоset thisline=%thisline%%%I
AMK

Я обновил заголовок.
Isiah Meadows

2

Linq

Эффективность не важна, правильность есть. Написание в функциональном стиле приводит к более ясному и менее подверженному ошибкам коду. Если производительность оказывается проблемой, последняя строка ToArray () может быть опущена. В любом случае лучше быть ленивым.

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 (Visualworks, Gemstone Squeak / Pharo, ...) с именем Xtreams что делает эту задачу более простой.

FileStream будет таким же простым, как 'foo' asFilename readingи, 'bar' asFilename writingнапример, в Visualworks, но зависит от диалекта.
По этой причине я демонстрирую алгоритм с диалектом нейтральных внутренних потоков вместо этого.
Хорошей идеей может быть обработка каждого байтового кода в порядке возрастания:

| 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

Конечно, также возможно обрабатывать в случайном порядке, но я боюсь, что это делает код слишком компактным:

| 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

РЕДАКТИРОВАТЬ

Ах, глупый я, я не видел решение 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

BASH

на терминале № 1 с IP, 192.168.1.2

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

на терминале № 2 с IP, 192.168.1.3

gpg -c mydocument.docx | nc 192.168.1.2 8080

Это зашифрует и отправит mydocument.docx, используя ncи gpg, на терминал # 1 Вам нужно будет ввести пароль на терминале № 2, затем на терминале # 1


Вы можете пометить код?

я новичок, но здесь, nc -l 8080 говорит netcat прослушивать порт 8080. все, что отправлено на 192.168.1.2:8080, будет отображаться на терминале № 1 на терминале № 2, gpg шифрует mydocument.docx и передает его Netcat. nc 192.168.1.2 8080 отправляет зашифрованный файл mydocument.docx на терминал # 1, когда # 1 получает его, расшифровывает его с помощью gpg -d и сохраняет i
Fews1932

1

C ++

Это в некоторой степени основано на ответе Шингецу , но я не мог удержаться. Он полностью функционирует, но ни один ученик не подаст его своему учителю (я надеюсь). Если они захотят проанализировать код, они смогут решить свою проблему:

#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 (не совсем), не хватает JQuery. Также слишком много ошибок проверки. Я думаю, что вы даже закрыли файл! Gawd.

Я мог знать, что JQuery готовится!

1

питон

Вводит текст из file1.txt и выводит его в file2.txt

Это полно и "работает". Никто не сказал ничего о написании ввода как оно есть. Все входные символы появляются на выходе. «getchar» - часть троллинга.

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 символа

Реализация

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

выполнение

f["one file", "another"]

Проверьте

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


Где тролль? Я не знаю, Mathematica.

Это смехотворно серьезный ответ.
Крис Дегнен

Ой. Вы читали правила троллинга кода? codegolf.stackexchange.com/tags/code-trolling/info

Не совсем, но ответ абсурдно , так как я мог бы использовать Mathematica «s CopyFileфункцию.
Крис Дегнен

1

DELPHI / PASCAL (скопировать из f1.txt в 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

Я, конечно, не эксперт по сборке, но ниже мой маленький фрагмент:

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

Вы заметили бит "полная, рабочая функция"? Во всяком случае, вот мой ответ:

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

1

Lua

io.read()

Запустить с входным файлом, содержащим text from one file and output it to another. Solution should be a complete, working function..


2
Людям однажды хватит этих ответов :( У меня уже было.
Vereos


1

#! / Bin / ш

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

Выглядит разумно, но довольно неэффективно, если файл большой.

Отлично работает с файлами ASCII, за исключением случаев, когда входной файл содержит -n, -eили -E. (Потому что они интерпретируются как аргументы echo.)

Не выдает правильный вывод для всех (большинства) двоичных файлов.

(Использование printf "%s" "$contents" > outputпод/bin/bash работает немного лучше, но при этом все равно сбрасывается NULL байт.)

Да, и, конечно, это не работает для имен файлов_содержащих_пространств. Но такие файлы в UNIX% 20policy являются незаконными в любом случае.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.