チャレンジ:
1つのファイルからテキストを入力し、別のファイルに出力します。解決策は完全で機能する機能でなければなりません。
注:これはコードトローリングの質問です。質問や回答を真剣に受け取らないでください。詳細はこちら。
チャレンジ:
1つのファイルからテキストを入力し、別のファイルに出力します。解決策は完全で機能する機能でなければなりません。
注:これはコードトローリングの質問です。質問や回答を真剣に受け取らないでください。詳細はこちら。
回答:
複数のプログラミング言語を持つことの全体的なポイントは、仕事に適切なツールを使用する必要があるということです。
この場合、あるファイルから別のファイルにバイトをコピーします。
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のようなもののゴミを読み、初心者にとっては完全に中国人であり、助けを求めていることに気づいたときに彼を怖がらせるからです。
#define VERY filename1
#define NOT filename2
#define _ 1
、(;_;)
forループを使用して、スマイリーのように見せることができます。
#define LOL fclose
私の一日を作った
誰もが知っているように、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);
}
}
安全のために、最初に小さなファイルでこれをテストしてください。正しいことを確認したら、非常に大きなファイルで使用するために心配することなく本番環境に入れることができます。
C#
これを実現するには、いくつかのことを確認する必要があります。
コードは次のとおりです。
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
}
}
多くの人々は、正規表現を使用したり、文字列を評価して、あるファイルから別のファイルにコピーしようとすると便利ですが、そのプログラミング方法は粗雑です。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つのファイルからテキストを入力する」ことの意味についての質問のあいまいさに対する遊びであり、(ランダムに生成された)クレイジーな変数名は、ちょっとした楽しみのためのものでした。
@Shingetsuが指摘したように、適切なツールを適切な仕事に使用する必要があります。あるファイルから別のファイルにコンテンツをコピーすることは古い問題であり、そのようなファイル管理タスクに最適なツールはシェルを使用することです。
すべてのプログラマは、とその人自身を理解する必要があることを1つのシェルコマンドは共通であるtac
ために使用されるコマンド、TACは、一緒に次々とファイルの内容をKです。この特殊なケースとして、1つのファイルのみが渡された場合、単純にそのまま吐き出されます。次に、出力を適切なファイルにリダイレクトします。
tac inputfile.txt >outputfile.txt
シンプルでわかりやすい、トリックなし!
ウイルス対策が含まれています。
#!/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"};
(あなたはこの「死んだ」言語を持っているはずだからです;-)
@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
効率は重要ではなく、正確さが重要です。機能的なスタイルで記述すると、コードがより明確になり、エラーが発生しにくくなります。パフォーマンスが問題になる場合は、最後の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();
}
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
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でパスワードを入力する必要があります。
これは、新月の答えにいくらか基づいていますが、私は抵抗できませんでした。完全に機能していますが、教師に提出する学生はいません(願っています)。彼らがコードを分析することをいとわないならば、彼らは彼らの問題を解決することができるでしょう:
#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;
}
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)
実装
f = (BinaryWrite[#2, BinaryReadList@#]; Close@#2) &
実行
f["one file", "another"]
小切手
check = Import[StringJoin["!diff \"", #, "\" \"", #2, "\" 2>&1"], "Text"] &;
check["one file", "another"]
CopyFile
関数を使用できたので、答えはばかげています。
私は確かにアセンブリの専門家ではありませんが、以下は私の小さな断片です。
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
io.read()
を含む入力ファイルで実行しますtext from one file and output it to another. Solution should be a complete, working function.
。
PHP
function copyFile($input, $output)
{
return file_put_contents($output, file_get_contents($input));
}
contents=`< $1` ; echo "$contents" > $2
合理的に見えますが、ファイルが大きい場合はむしろ非効率的です。
入力ファイルに-n
、-e
またはが含まれている場合を除き、ASCIIファイルで正常に動作します-E
。(これらは引数として解釈されるためecho
です。)
すべての(ほとんどの)バイナリファイルに対して正しい出力を生成しません。
(printf "%s" "$contents" > output
under を使用/bin/bash
すると少しうまく機能しますが、それでもNULLバイトがドロップされます。)
ああ、もちろんfilenames_taining_spacesでは機能しません。しかし、とにかくそのようなファイルはUNIX%20ポリシーでは違法です。