あるファイルからテキストを入力し、別のファイルに出力する


13

チャレンジ:

1つのファイルからテキストを入力し、別のファイルに出力します。解決策は完全で機能する機能でなければなりません。

注:これは質問です。質問や回答を真剣に受け取らないでください。詳細はこちら


公式のスタンスによるとコードトローリングは削除中です。この質問にはかなりの票があり、1つの非常に高い回答があります。投票で50%をわずかに超える「削除」票を受け取りましたが、約8%しかなかったため、歴史的な意味でロックしています。
ドアノブ

回答:


40

C

複数のプログラミング言語を持つことの全体的なポイントは、仕事に適切なツールを使用する必要があるということです。
この場合、あるファイルから別のファイルにバイトをコピーします。
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のようなもののゴミを読み、初心者にとっては完全に中国人であり、助けを求めていることに気づいたときに彼を怖がらせるからです。


8
#define VERY filename1 #define NOT filename2
ジョーZ.

1
これらの定義を変更しました。より多くの混乱のために、関数宣言でそれらを同じにしました!

8
また、場合は#define _ 1(;_;)forループを使用して、スマイリーのように見せることができます。
ジョーZ.

5
#define LOL fclose私の一日を作った
THWD

1
#define LOL fclose、使用されることはありませんが私の傑作です。

28

sh

このシンプルさが気に入っています。

echo File1.txt > File2.txt

File1.txt「File1.text」が含まれている場合にのみ実際に正常に動作します...


何が問題なのですか?

4
@ user2509848それはにテキスト「FILE1.TXT」を置くFile2.txtのではない実際の内容、File1.txt
syb0rg

しかし、これは実際に...質問をカンニングしない
ジェレミー・

1
bash固有のものは何もないので、同じようにshでも構いません。
カヤ

1
それはのksh作る、彼はそれを取得する場所を把握する必要があります

8

AutoHotKey

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

最初にファイルをメモ帳または他のテキストエディタで開き、ウィンドウ名がファイル名で始まるようにする必要があります。次に、file1の内容をクリップボードにコピーします(文字列では、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
最初のパスでは、古いファイルの最初の文字が新しいファイルに書き込まれます。2回目は新しいファイルを削除し、古いファイルの最初の2文字を新しいファイルに書き込みます。3回目、3文字など。冗長であるだけでなく、コンピューターがクラッシュした場合、(おそらく)部分的なファイルになります!
dms

6

C#

これを実現するには、いくつかのことを確認する必要があります。

  1. ファイルから文字列を読み取る
  2. Visual Studio用のMicrosoft File IOおよびString Extensionをダウンロードする
  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

4つの簡単な手順で:

  1. ファイルを印刷します。lprこれにはコマンドを使用できます。
  2. 印刷物をスキャンサービスに郵送します。(これには郵便料金が必要です)。
  3. スキャンサービスが印刷物をスキャンし、OCRを実行します。
  4. 適切なファイルの場所にダウンロードします。

役に立たない答えを作成する良い仕事!

このRFC1149は互換性がありますか?
マークKコーワン

@ user2509848私は...良い仕事ではなく、答えの無駄なジョブを作成すると言うだろう
Kiwy

4

Java

多くの人々は、正規表現を使用したり、文字列を評価して、あるファイルから別のファイルにコピーしようとすると便利ですが、そのプログラミング方法は粗雑です。OOPによりコードの透明性が向上するため、まずJavaを使用します。次に、最初のファイルからデータを受信して​​2番目のファイルに書き込むために対話型インターフェイスを使用します。

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番目のファイルに書き込みます。この応答は、「1つのファイルからテキストを入力する」ことの意味についての質問のあいまいさに対する遊びであり、(ランダムに生成された)クレイジーな変数名は、ちょっとした楽しみのためのものでした。


2
私はこれに似たものを作ることを考えていました... 1つのファイルから部分入力テキストを誤解するのではなく、数学者のアプローチに従って、問題をすでに解決されたものに減らしました。=>画面入力の処理。...しかし、良い解決策を考え出すていなかった
Kiruse

3

sh

@Shingetsuが指摘したように、適切なツールを適切な仕事に使用する必要があります。あるファイルから別のファイルにコンテンツをコピーすることは古い問題であり、そのようなファイル管理タスクに最適なツールはシェルを使用することです。

すべてのプログラマは、とその人自身を理解する必要があることを1つのシェルコマンドは共通であるtacために使用されるコマンド、TACは、一緒に次々とファイルの内容をKです。この特殊なケースとして、1つのファイルのみが渡された場合、単純にそのまま吐き出されます。次に、出力を適切なファイルにリダイレクトします。

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!%%IWindowsのCMDでのみ動作します。DOSでは、単純な動作する必要がありますset thisline=%thisline%%%I
AMK

タイトルを更新しました。
イサイアメドウズ14年

2

リンク

効率は重要ではなく、正確さが重要です。機能的なスタイルで記述すると、コードがより明確になり、エラーが発生しにくくなります。パフォーマンスが問題になる場合は、最後の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

Xtreamsという名前のいくつかのSmalltalk方言(Visualworks、Gemstone Squeak / Pharoなど)に移植されたライブラリがあり、このタスクを簡単に実行できます。

FileStreamは、たとえばVisualworks 'foo' asFilename readingと同じくらい簡単です'bar' asFilename writingが、方言に固有です。
このため、代わりに、方言に依存しない内部ストリームを使用したアルゴリズムを示します。
各バイトコードを昇順で処理することをお勧めします。

| 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

バッシュ

IPを備えた端末#1、192.168.1.2

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

IPを備えた端末#2、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に送信されたものはすべて、端末#2の端末#1に表示され、gpgはmydocument.docxを暗号化し、 netcat。nc 192.168.1.2 8080それは、それはそれで復号化したときに#1 recieves端末#1の上で暗号化mydocument.docxを送るのgpg -d、私節約
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

Python

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-user10766 14

正確ではありませんが、MathematicaCopyFile関数を使用できたので、答えはばかげています。
クリスデグネン14年

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

ルア

io.read()

を含む入力ファイルで実行しますtext from one file and output it to another. Solution should be a complete, working function.


2
人々はいつかこれらの答えを十分に持っているでしょう:(私はすでに持っていました。
Vereos 14年


1

#!/ bin / sh

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

合理的に見えますが、ファイルが大きい場合はむしろ非効率的です。

入力ファイルに-n-eまたはが含まれている場合を除き、ASCIIファイルで正常に動作します-E。(これらは引数として解釈されるためechoです。)

すべての(ほとんどの)バイナリファイルに対して正しい出力を生成しません。

printf "%s" "$contents" > outputunder を使用/bin/bashすると少しうまく機能しますが、それでもNULLバイトがドロップされます。)

ああ、もちろんfilenames_taining_spacesでは機能しません。しかし、とにかくそのようなファイルはUNIX%20ポリシーでは違法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.