Введіть текст з одного файлу, виведіть його в інший


13

Змагання:

Введіть текст з одного файлу та виведіть його в інший. Рішення повинно бути повноцінною, робочою функцією.

Примітка. Це запитання щодо . Будь ласка, не сприймайте питання та / або відповіді серйозно. Більше інформації тут .


Процедура видалення коду перебуває в процесі видалення відповідно до офіційної позиції. На це питання є достатня кількість голосів з однією вкрай високоголосною відповіддю. Він отримав трохи більше 50% "видалити" голосів у опитуванні , але лише приблизно на 8%, тому я фіксую це на історичну значимість.
Дверна ручка

Відповіді:


40

С

Вся суть у наявності декількох мов програмування полягає в тому, що вам потрібно використовувати правильний інструмент для роботи.
У цьому випадку ми хочемо скопіювати байти з одного файлу в інший.
Хоча ми можемо використовувати щось фантазійне, як баш або рубін, або впасти під силу 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_;
}

Це зло, тому що він буде читати сміття на таких речах, як цигвін, цілком китайський для початківця, злякає його, коли зрозуміє, що це заклик про допомогу і, очевидно, тому, що С.


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

1
Змінили ці налаштування для вас. Я залишив їх однаковими у декларації про функцію БІЛЬШЕ плутанини!

8
Крім того, якщо ви #define _ 1можете зробити (;_;)це за допомогою петлі for, щоб це було схоже на смайлик.
Джо З.

5
#define LOL fcloseзробив свій день
вт

1
#define LOL fclose, який ніколи не використовується - це мій шедевр.

28

ш

Мені подобається простота цього.

echo File1.txt > File2.txt

Дійсно працює належним чином, лише якщо File1.txtмістить "File1.text" ...


Що з цим не так?

4
@ user2509848 Він додає текст "File1.txt" File2.txt, а не власне змістFile1.txt
syb0rg

Але це насправді не обманює питання ...
jeremy

1
Можливо, так само добре, бо немає нічого конкретного.
Кая

1
щоб зробити його ksh, йому доведеться з’ясувати, де його взяти

8

AutoHotKey

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

Спочатку потрібно відкрити файли в блокноті чи іншому текстовому редакторі, завдяки якому імена вікон починаються з імен файлів. Потім він копіює вміст file1 у буфер обміну (буквально, використовуючи ctrl+ c) і вставляє його у файл2, перезаписуючи все, що зараз знаходиться в ньому, і зберігає.

Вирішує проблему, але дуже незручно і досить марно. Можливо, простіше просто копіювати та вставляти вручну.


Відмінно! Цікаво, що б подумав учитель?

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
Перший прохід через нього записує перший символ старого файлу в новий файл. Вдруге через нього видаляється новий файл і записуються перші два символи старого файлу в новий файл. Третій раз, три символи тощо. Мало того, що це не зайве, але якщо ваш комп'ютер вийде з ладу, ви (можливо) отримаєте частковий файл!
dms

6

C #

Щоб цього досягти, ви повинні переконатися в виконанні декількох речей:

  1. Читання рядка з файлу
  2. Завантажте IO і розширення рядків Microsoft для 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. Служба сканування сканує роздруківки і зробить OCR для вас.
  4. Завантажте у відповідне розташування файлу.

Гарна робота по створенню марної відповіді!

Чи сумісний цей RFC1149?
Марк К Коуан

@ user2509848 Я б сказав, що хороша робота, створюючи марну роботу замість відповіді ...
Kiwy

4

Java

Багато людей вважають корисним намагатися використовувати регулярні вирази або оцінювати рядки, щоб скопіювати їх з одного файлу в інший, однак такий спосіб програмування є неохайним. По-перше, ми використовуємо Java, оскільки OOP дозволяє підвищити прозорість нашого коду, а по-друге, ми використовуємо інтерактивний інтерфейс для отримання даних з першого файлу та записуємо його у другий.

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

Я оновив заголовок.
Ісія Медоуз

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

EDIT

Ах дурний, я не бачив рішення 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

БАШ

на терміналі №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 і передає, що сітка. 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. Також занадто багато перевірки помилок. Я думаю, ти навіть закрив файл! Гауд.

Я міг би знати, що 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

Математика, 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

МАСМ

Я, звичайно, не фахівець з монтажу, але нижче мій маленький фрагмент:

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

Луа

io.read()

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


2
Людям одного дня буде достатньо таких відповідей :( я вже мав.
Вереос,


1

#! / бін / ш

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.