Các thách thức:
Nhập văn bản từ một tệp và xuất nó sang tệp khác. Giải pháp nên là một chức năng hoàn chỉnh, làm việc.
Lưu ý: Đây là một câu hỏi trolling mã . Xin đừng coi trọng câu hỏi và / hoặc câu trả lời. Thêm thông tin ở đây .
Các thách thức:
Nhập văn bản từ một tệp và xuất nó sang tệp khác. Giải pháp nên là một chức năng hoàn chỉnh, làm việc.
Lưu ý: Đây là một câu hỏi trolling mã . Xin đừng coi trọng câu hỏi và / hoặc câu trả lời. Thêm thông tin ở đây .
Câu trả lời:
Điểm chung của việc có nhiều ngôn ngữ lập trình là bạn cần sử dụng đúng công cụ cho công việc.
Trong trường hợp này, chúng tôi muốn sao chép byte từ tệp này sang tệp khác.
Mặc dù chúng ta có thể sử dụng thứ gì đó lạ mắt như bash hoặc ruby, hoặc rơi vào sức mạnh của ASM, chúng ta cần thứ gì đó nhanh chóng, tốt với bit và nhanh.
Sự lựa chọn rõ ràng là C.
Cách làm SIMPLEST sẽ như vậy:
#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_;
}
Điều này là xấu xa vì nó sẽ đọc rác trên những thứ như cygwin, hoàn toàn là tiếng Trung Quốc cho người mới bắt đầu, sẽ khiến anh ta sợ hãi khi nhận ra đó là lời kêu cứu và rõ ràng là vì C.
#define VERY filename1
#define NOT filename2
#define _ 1
, bạn có thể thực hiện (;_;)
với vòng lặp for, để làm cho nó trông giống như một nụ cười.
#define LOL fclose
làm tôi day
Tôi thích sự đơn giản của cái này.
echo File1.txt > File2.txt
Thực sự chỉ hoạt động đúng nếu File1.txt
chứa "File1.text" ...
File2.txt
, chứ không phải nội dung thực tế củaFile1.txt
WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s
Trước tiên, bạn phải mở tệp trong notepad hoặc một số trình soạn thảo văn bản khác làm cho tên cửa sổ bắt đầu bằng tên tệp. Sau đó, nó sao chép nội dung của tệp1 vào bảng tạm (theo nghĩa đen, sử dụng ctrl+ c) và dán nó vào tệp2, ghi đè lên bất cứ thứ gì hiện có trong đó và lưu lại.
Giải quyết vấn đề, nhưng theo một cách rất bất tiện và khá vô dụng. Có lẽ sẽ dễ dàng hơn chỉ cần sao chép và dán thủ công.
Như mọi người đều biết, perl rất tốt cho việc thao tác các tập tin. Mã này sẽ sao chép nội dung của một tệp này sang tệp khác và sẽ làm như vậy với sự dư thừa để có biện pháp tốt.
#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);
}
}
Để an toàn, hãy kiểm tra điều này trên một tệp nhỏ lúc đầu. Một khi bạn bị thuyết phục về tính chính xác của nó, bạn có thể đưa nó vào sản xuất để sử dụng trên các tệp rất lớn mà không phải lo lắng.
C #
Để đạt được điều này, bạn phải đảm bảo thực hiện một số điều:
Đây là mã:
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
}
}
Trong bốn bước đơn giản:
lpr
lệnh cho việc này.Nhiều người thấy hữu ích khi cố gắng sử dụng các biểu thức thông thường hoặc đánh giá các chuỗi để sao chép chúng từ tệp này sang tệp khác, tuy nhiên phương pháp lập trình đó là cẩu thả. Đầu tiên chúng tôi sử dụng Java vì OOP cho phép minh bạch hơn trong mã của chúng tôi và thứ hai chúng tôi sử dụng giao diện tương tác để nhận dữ liệu từ tệp đầu tiên và ghi nó vào tệp thứ hai.
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());
}
}
Về lý thuyết (tôi chưa kiểm tra nó) điều này làm cho người dùng nhập thủ công nội dung của tệp đầu tiên (từng chữ) và sau đó ghi nó vào tệp thứ hai. Câu trả lời này là một cách chơi cho sự mơ hồ của câu hỏi về ý nghĩa của "văn bản đầu vào từ một tệp" và các tên biến điên (được tạo ngẫu nhiên) chỉ để thêm phần thú vị.
Giống như @S Breathetsu chỉ ra, người ta phải sử dụng đúng công cụ cho đúng công việc. Sao chép nội dung từ tệp này sang tệp khác là một vấn đề cũ và công cụ tốt nhất cho các tác vụ quản lý tệp đó là sử dụng trình bao.
Một lệnh shell mà mọi lập trình viên phải tự làm quen với chúng là tac
lệnh chung , được sử dụng để tac k nội dung của các tệp với nhau, từng cái một. Như một trường hợp đặc biệt của điều này, khi chỉ có một tệp được truyền vào, nó chỉ đơn giản là nhổ ra như cũ. Sau đó chúng tôi chỉ cần chuyển hướng đầu ra đến tệp thích hợp:
tac inputfile.txt >outputfile.txt
Đơn giản và quan điểm, không có thủ thuật!
Bao gồm virus.
#!/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"};
(vì bạn phải có ngôn ngữ được cho là "chết" này ;-)
@echo off
setlocal enabledelayedexpansion
for %%I in ('type %1') do set this=!this!%%I
echo !this!>%2 2>nul
Bạn chỉ cần gọi đây là copy.bat file1.txt file2.txt
(hoặc bất kỳ tệp nào bạn muốn)
Nếu chỉ có nó sẽ giữ ngắt dòng ...
setlocal enabledelayedexpansion
và set thisline=!thisline!%%I
chỉ hoạt động trong Windows CMD. Trong DOS phải hoạt động đơn giảnset thisline=%thisline%%%I
Hiệu quả không quan trọng, đúng là như vậy. Viết theo kiểu chức năng dẫn đến mã rõ ràng hơn và ít bị lỗi hơn. Nếu hiệu suất hóa ra là một vấn đề, dòng ToArray () cuối cùng có thể được bỏ qua. Dù sao thì tốt hơn là lười biếng.
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
Có một thư viện được chuyển đến một số phương ngữ Smalltalk (Visualworks, Gemstone Squeak / Pharo, ...) có tên Xtreams giúp cho công việc này trở nên dễ dàng hơn.
FileStream sẽ đơn giản như 'foo' asFilename reading
và 'bar' asFilename writing
ví dụ trong Visualworks, nhưng là phương ngữ cụ thể.
Vì lý do này, tôi chứng minh thuật toán với các luồng nội bộ trung lập phương ngữ thay thế.
Một ý tưởng tốt có thể là xử lý từng mã byte theo thứ tự tăng dần:
| 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
Tất nhiên, cũng có thể xử lý theo thứ tự ngẫu nhiên, nhưng tôi sợ rằng nó làm cho mã quá nhỏ gọn:
| 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
BIÊN TẬP
Ah ngu ngốc, tôi đã không thấy giải pháp 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
trên thiết bị đầu cuối số 1 với IP, 192.168.1.2
nc -l 8080 | gpg -d > mydocument.docx
trên thiết bị đầu cuối số 2 với IP, 192.168.1.3
gpg -c mydocument.docx | nc 192.168.1.2 8080
Điều này sẽ mã hóa và gửi mydocument.docx
, sử dụng nc
và gpg
, qua thiết bị đầu cuối # 1 Bạn sẽ phải nhập mật khẩu trên thiết bị đầu cuối số 2, sau đó trên thiết bị đầu cuối số 1
Điều này phần nào dựa trên câu trả lời của Shingetsu , nhưng tôi không thể cưỡng lại. Nó hoạt động đầy đủ, nhưng không học sinh nào gửi nó cho giáo viên của họ (tôi hy vọng). Nếu họ sẵn sàng phân tích mã, họ sẽ có thể giải quyết vấn đề của họ:
#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;
}
Nhập văn bản từ file1.txt và xuất nó thành file2.txt
Nó hoàn thành và "làm việc". Không ai nói bất cứ điều gì về việc viết đầu vào như nó là. Tất cả các ký tự đầu vào xuất hiện trong đầu ra. "getchar" là phần trolling.
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)
Thực hiện
f = (BinaryWrite[#2, BinaryReadList@#]; Close@#2) &
Chấp hành
f["one file", "another"]
Kiểm tra
check = Import[StringJoin["!diff \"", #, "\" \"", #2, "\" 2>&1"], "Text"] &;
check["one file", "another"]
CopyFile
chức năng.
Tôi chắc chắn không phải là một chuyên gia lắp ráp, nhưng dưới đây là đoạn trích nhỏ của tôi:
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()
Chạy với một tập tin đầu vào có chứa 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
Có vẻ hợp lý, nhưng khá không hiệu quả nếu tệp lớn.
Hoạt động tốt trên các tệp ASCII trừ khi tệp đầu vào chứa -n
, -e
hoặc -E
. (Bởi vì những điều này được hiểu là đối số của echo
.)
Không tạo ra đầu ra chính xác cho tất cả (hầu hết) tệp nhị phân.
(Sử dụng printf "%s" "$contents" > output
bên dưới /bin/bash
hoạt động tốt hơn một chút, nhưng vẫn giảm byte NULL.)
Ồ và tất nhiên nó không hoạt động cho filenames_contained_spaces. Nhưng các tệp như vậy là bất hợp pháp theo UNIX% 20policy.