ความท้าทาย:
ข้อความที่ป้อนจากไฟล์หนึ่งและส่งออกไปยังอีก วิธีแก้ปัญหาควรเป็นฟังก์ชั่นการทำงานที่สมบูรณ์
หมายเหตุ: นี่เป็นคำถามการหมุนรหัส กรุณาอย่าใช้คำถามและ / หรือคำตอบอย่างจริงจัง ข้อมูลเพิ่มเติมที่นี่
ความท้าทาย:
ข้อความที่ป้อนจากไฟล์หนึ่งและส่งออกไปยังอีก วิธีแก้ปัญหาควรเป็นฟังก์ชั่นการทำงานที่สมบูรณ์
หมายเหตุ: นี่เป็นคำถามการหมุนรหัส กรุณาอย่าใช้คำถามและ / หรือคำตอบอย่างจริงจัง ข้อมูลเพิ่มเติมที่นี่
คำตอบ:
จุดรวมของการมีหลายภาษาการเขียนโปรแกรมคือคุณต้องใช้เครื่องมือที่เหมาะสมสำหรับงาน
ในกรณีนี้เราต้องการคัดลอกไบต์จากไฟล์หนึ่งไปอีกไฟล์หนึ่ง
ในขณะที่เราสามารถใช้สิ่งแฟนซีเช่นทุบตีหรือทับทิมหรือตกอยู่ในอำนาจของ 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 เป็นภาษาจีนโดยสมบูรณ์สำหรับผู้เริ่มต้นจะทำให้เขาตกใจเมื่อเขาตระหนักว่ามันเป็นสิ่งที่เรียกร้องให้ช่วยและเห็นได้ชัดเพราะ C.
#define VERY filename1
#define NOT filename2
#define _ 1
คุณสามารถสร้าง(;_;)
ด้วย for-loop เพื่อทำให้มันดูเหมือนเป็นรอยยิ้ม
#define LOL fclose
ทำวันของฉัน
ฉันชอบความเรียบง่ายของอันนี้
echo File1.txt > File2.txt
ทำงานได้อย่างถูกต้องหากFile1.txt
มี "File1.text" ...
File2.txt
ไม่ใช่เนื้อหาจริงของFile1.txt
WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s
ก่อนอื่นคุณต้องเปิดไฟล์ใน notepad หรือแก้ไขข้อความอื่น ๆ ที่ทำให้ชื่อหน้าต่างเริ่มต้นด้วยชื่อไฟล์ จากนั้นจะคัดลอกเนื้อหาของ file1 ไปยังคลิปบอร์ด (ตัวอักษรโดยใช้ctrl+ c) และวางลงใน file2 เขียนทับสิ่งที่อยู่ในนั้นและบันทึก
แก้ไขปัญหา แต่ในแบบที่ไม่สะดวกและไร้ประโยชน์ การคัดลอกและวางด้วยตนเองอาจทำได้ง่ายกว่า
ในฐานะที่ทุกคนรู้ว่า 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);
}
}
เพื่อความปลอดภัยให้ทดสอบไฟล์เล็ก ๆ นี้ก่อน เมื่อคุณมั่นใจในความถูกต้องแล้วคุณสามารถนำไปผลิตต่อเพื่อใช้กับไฟล์ที่มีขนาดใหญ่มากโดยไม่ต้องกังวล
ค#
เพื่อให้บรรลุเป้าหมายนี้คุณต้องแน่ใจว่าได้ทำหลายสิ่ง:
นี่คือรหัส:
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
คำสั่งสำหรับสิ่งนี้ผู้คนจำนวนมากพบว่ามีประโยชน์ในการพยายามใช้นิพจน์ปกติหรือประเมินสตริงเพื่อคัดลอกจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งอย่างไรก็ตามวิธีการเขียนโปรแกรมนั้นไม่เป็นระเบียบ ครั้งแรกที่เราใช้ 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());
}
}
ในทางทฤษฎี (ฉันไม่ได้ทดสอบ) สิ่งนี้ทำให้ผู้ใช้ป้อนเนื้อหาของไฟล์แรก (คำต่อคำ) ด้วยตนเองแล้วเขียนลงในไฟล์ที่สอง การตอบสนองนี้เป็นการเล่นที่คลุมเครือของคำถามเกี่ยวกับความหมายของคำว่า "การป้อนข้อความจากไฟล์เดียว" และชื่อตัวแปรบ้า (สร้างแบบสุ่ม) เป็นเพียงความสนุกพิเศษ
อย่างที่ @Singetsu ชี้ให้เห็นเราต้องใช้เครื่องมือที่เหมาะสมสำหรับงานที่เหมาะสม การคัดลอกเนื้อหาจากไฟล์หนึ่งไปยังอีกไฟล์เป็นปัญหาเก่าและเครื่องมือที่ดีที่สุดสำหรับงานการจัดการไฟล์คือใช้เชลล์
หนึ่งในคำสั่งของเชลล์ที่โปรแกรมเมอร์ทุกคนมีที่จะทำความคุ้นเคยกับตัวเองเป็นส่วนtac
คำสั่งที่ใช้ในการแทค k เนื้อหาของไฟล์ร่วมกันหนึ่งหลังจากที่อื่น ในกรณีพิเศษนี้เมื่อมีเพียงไฟล์เดียวเท่านั้นที่ผ่านเข้ามามันจะคายออกมาตามที่เป็นอยู่อีกครั้ง จากนั้นเราเพียงแค่เปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ที่เหมาะสม:
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();
}
หูฟัง
มีห้องสมุดที่ย้ายไปยังภาษาท้องถิ่นขนาดเล็กหลายภาษา (Visualworks, Gemstone Squeak / Pharo, ... ) ชื่อXtreamsที่ทำให้งานนี้ง่ายกว่ามาก
FileStream จะง่ายเหมือน'foo' asFilename reading
และ'bar' asFilename writing
ตัวอย่างใน Visualworks แต่เป็นภาษาเฉพาะ
ด้วยเหตุนี้ฉันแสดงให้เห็นถึงอัลกอริทึมที่มี Streams ภายในเป็นกลางทางภาษาแทน
ความคิดที่ดีคือการประมวลผลรหัสไบต์แต่ละลำดับเพื่อเพิ่ม:
| 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, 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
นี่เป็นคำตอบของ Shingetsuแต่ฉันไม่สามารถต้านทานได้ มันใช้งานได้ดี แต่ไม่มีนักเรียนส่งให้ครู (หวังว่า) หากพวกเขายินดีที่จะวิเคราะห์รหัสพวกเขาจะสามารถแก้ไขปัญหาได้
#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
ได้
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.
แน่นอนว่าฉันไม่ใช่ผู้เชี่ยวชาญด้านการประกอบ แต่ด้านล่างเป็นตัวอย่างเล็ก ๆ ของฉัน:
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
คุณสังเกตเห็นบิต "สมบูรณ์ฟังก์ชั่นการทำงาน" หรือไม่? อย่างไรก็ตามนี่คือคำตอบของฉัน:
#include <stdlib.h>
int main(void)
{
system("echo < input > dest");
}
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
ดูสมเหตุสมผล แต่ไม่มีประสิทธิภาพหากไฟล์มีขนาดใหญ่
ปรับการทำงานกับไฟล์ ASCII ยกเว้นเมื่อแฟ้มใส่มี-n
, หรือ-e
-E
(เพราะสิ่งเหล่านี้ถูกตีความว่าเป็นข้อโต้แย้งโดยecho
)
ไม่สร้างเอาต์พุตที่ถูกต้องสำหรับไฟล์ไบนารีทั้งหมด (ส่วนใหญ่)
(การใช้printf "%s" "$contents" > output
ภายใต้ใช้/bin/bash
งานได้ดีขึ้นเล็กน้อย แต่ยังคงลดลงเป็น NULL ไบต์)
โอ้และแน่นอนว่ามันใช้ไม่ได้กับ filenames_containing_spaces แต่ไฟล์ดังกล่าวผิดกฎหมายภายใต้ UNIX% 20policy อยู่ดี