답변:
여러 프로그래밍 언어를 사용하는 요점은 작업에 적합한 도구를 사용해야한다는 것입니다.
이 경우 한 파일에서 다른 파일로 바이트를 복사하려고합니다.
우리는 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
, 당신은 할 수 (;_;)
는 웃는처럼 보이게하려면에 대한 루프와 함께.
#define LOL fclose
내 하루를
WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s
창 이름을 파일 이름으로 시작하는 메모장 또는 다른 텍스트 편집기에서 파일을 먼저 열어야합니다. 그런 다음 file1의 내용을 클립 보드에 복사하고 (문자를 사용하여 ctrl+ c) 파일 2에 붙여넣고 현재 파일을 덮어 쓰고 저장합니다.
문제를 해결하지만 매우 불편하고 쓸모없는 방식으로 해결합니다. 수동으로 복사하여 붙여 넣기가 더 쉬울 것입니다.
모두 알고 있듯이 펄은 파일 조작에 매우 좋습니다. 이 코드는 한 파일의 내용을 다른 파일의 내용으로 복사하며, 여분의 중복성을 사용하여 측정합니다.
#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);
}
}
안전을 위해 처음에는 작은 파일로 테스트하십시오. 정확성을 확신하면 걱정없이 매우 큰 파일에 사용할 수 있도록 프로덕션 환경에 넣을 수 있습니다.
씨#
이를 달성하려면 몇 가지 작업을 수행해야합니다.
코드는 다음과 같습니다.
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
}
}
간단한 네 단계로 :
lpr
이 명령을 사용할 수 있습니다 .많은 사람들이 정규 표현식을 사용하거나 한 파일에서 다른 파일로 문자열을 복사하기 위해 문자열을 평가하는 것이 유용하지만 프로그래밍 방법이 느리다는 것을 알고 있습니다. 먼저 OOP가 코드에서 더 많은 투명성을 허용하기 때문에 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());
}
}
이론적으로 (테스트하지 않았습니다) 이것은 사용자가 첫 번째 파일의 내용 (단어별로)을 수동으로 입력 한 다음 두 번째 파일에 씁니다. 이 응답은 "한 파일에서 텍스트 입력"이라는 의미에 대한 질문의 모호성에 대한 연극이며 미친 변수 이름 (임의로 생성)은 약간의 재미를위한 것입니다.
@Shingetsu가 지적한 것처럼 올바른 작업에 적합한 도구를 사용해야합니다. 한 파일에서 다른 파일로 내용을 복사하는 것은 오래된 문제이며 이러한 파일 관리 작업을위한 가장 좋은 도구는 셸을 사용하는 것입니다.
모든 프로그래머가 자신에게 익숙해 져야하는 하나의 쉘 명령 은 파일의 내용을 하나씩 함께 다루는tac
데 사용되는 공통 명령 입니다. 특별한 경우로, 하나의 파일 만 전달 될 때 다시 그대로 그대로 뱉어집니다. 그런 다음 출력을 적절한 파일로 리디렉션합니다.
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();
}
잡담
Xtreams 라는 여러 스몰 토크 방언 (Visualworks, Gemstone Squeak / Pharo 등)으로 포팅 된 라이브러리가 있지만 이 작업을보다 쉽게 수행 할 수 있습니다.
FileStream은 Visualworks에서 'foo' asFilename reading
와 같이 단순 'bar' asFilename writing
하지만 방언에 따라 다릅니다.
이런 이유로 나는 대신 dialect 중립 내부 스트림을 사용하는 알고리즘을 보여줍니다.
각 바이트 코드를 증가하는 순서로 처리하는 것이 좋습니다.
| 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
contents=`< $1` ; echo "$contents" > $2
파일이 크면 합리적이지만 다소 비효율적입니다.
입력 파일에 포함 된 경우를 제외하고는 ASCII 파일에 잘 작동 -n
, -e
또는 -E
. (이것들은에 의해 인수로 해석되기 때문에 echo
.)
모든 (대부분) 이진 파일에 대해 올바른 출력을 생성하지 않습니다.
( printf "%s" "$contents" > output
under를 사용 /bin/bash
하면 조금 더 잘 작동하지만 여전히 NULL 바이트를 삭제합니다.)
물론 파일 이름 포함 파일 공간에서는 작동하지 않습니다. 그러나 이러한 파일은 UNIX % 정책에 따라 불법입니다.