Nhập văn bản từ một tệp, xuất nó sang tệp khác


13

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 . Xin đừng coi trọng câu hỏi và / hoặc câu trả lời. Thêm thông tin ở đây .


Mã trolling đang trong quá trình loại bỏ, theo lập trường chính thức. Câu hỏi này có số lượng phiếu bầu hợp lý với một câu trả lời được bình chọn cực kỳ cao. Nó nhận được chỉ hơn 50% "xóa" phiếu bầu trong cuộc thăm dò , nhưng chỉ khoảng 8%, vì vậy tôi đang khóa nó vì ý nghĩa lịch sử.
Doorknob

Câu trả lời:


40

C

Đ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.


8
#define VERY filename1 #define NOT filename2
Joe Z.

1
Thay đổi những defs cho bạn. Tôi giữ chúng giống nhau trên khai báo hàm cho sự nhầm lẫn THÊM!

8
Ngoài ra, nếu bạn #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.
Joe Z.

5
#define LOL fcloselàm tôi day
thwd

1
#define LOL fclose, mà không bao giờ được sử dụng là kiệt tác của tôi mặc dù.

28

sh

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.txtchứa "File1.text" ...


Điều gì là sai với nó?

4
@ user2509848 Nó đặt văn bản "File1.txt" File2.txt, chứ không phải nội dung thực tế củaFile1.txt
syb0rg

Nhưng điều này không thực sự lừa dối câu hỏi ...
jeremy 28/12/13

1
Cũng có thể là sh vì không có gì bash cụ thể.
Kaya

1
làm cho nó ksh, anh ta sẽ phải tìm ra nơi để có được nó

8

AutoHotKey

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.


Thông minh! Tôi tự hỏi giáo viên sẽ nghĩ gì?

6

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.


Liệu mã này xuất nó một lần, phá hủy tệp, sau đó thử xuất lại từ tệp đầu ra đầu tiên?

3
Lần đầu tiên đi qua nó ghi ký tự đầu tiên của tệp cũ vào tệp mới. Lần thứ hai thông qua nó xóa tệp mới và ghi hai ký tự đầu tiên của tệp cũ vào tệp mới. Lần thứ ba, ba ký tự, v.v. Không chỉ là dư thừa, mà nếu máy tính của bạn gặp sự cố, bạn sẽ (có thể) có một phần tệp!
dms

6

C #

Để đạt được điều này, bạn phải đảm bảo thực hiện một số điều:

  1. Đọc chuỗi từ tập tin
  2. Tải xuống Microsoft File IO và Chuỗi mở rộng cho Visual Studio
  3. Loại bỏ vi rút khỏi chuỗi ("khử trùng")
  4. Viết tập tin vào đường dẫn
  5. Xóa và tải lại bộ đệm

Đâ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
        }
    }

6

Trong bốn bước đơn giản:

  1. In tập tin. Bạn có thể sử dụng lprlệnh cho việc này.
  2. Gửi bản in đến một dịch vụ quét. (Bạn sẽ cần bưu chính cho việc này).
  3. Dịch vụ quét sẽ quét các bản in và thực hiện OCR cho bạn.
  4. Tải về vị trí tập tin thích hợp.

Tốt công việc tạo ra một câu trả lời vô dụng!

RFC1149 này có tương thích không?
Mark K Cowan

@ user2509848 Tôi sẽ nói rằng công việc tốt tạo ra công việc vô ích thay vì trả lời ...
Kiwy

4

Java

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ị.


2
Tôi đã suy nghĩ về việc tạo ra một cái gì đó tương tự như thế này ... không hiểu sai văn bản đầu vào một phần từ một tệp , nhưng theo cách tiếp cận của nhà toán học nói rằng tôi đã giảm vấn đề thành một vấn đề đã được giải quyết. => xử lý đầu vào màn hình. Không đưa ra một giải pháp tốt mặc dù ...
Kiruse

3

sh

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à taclệ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!


2

Perl

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"};

Rất thú vị, nó chỉ giả vờ kiểm tra virus, hay nó thực sự làm điều đó?

1
Không, nó chỉ xóa các chữ cái V, I, R, U, S khỏi tệp.
craftext

Oh. Vì bạn nói "loại bỏ vi-rút", có lẽ bạn cũng nên xóa 'E'.

2
Đúng. Nhưng nếu bạn muốn thực sự loại bỏ vi-rút, có một mô-đun CPAN để làm điều đó: search.cpan.org/~converter/Mail-ClamAV-0.29 .
craftext

2

Batch Windows

(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 enabledelayedexpansionset thisline=!thisline!%%Ichỉ hoạt động trong Windows CMD. Trong DOS phải hoạt động đơn giảnset thisline=%thisline%%%I
AMK

Tôi đã cập nhật tiêu đề.
Isiah Meadows

2

Linq

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();
}

2

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'bar' asFilename writingví 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

1

BASH

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 ncgpg, 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


Bạn có thể đánh dấu mã?

Tôi là một người mới, nhưng ở đây, nc -l 8080 nói với netcat hãy nghe trên cổng 8080. mọi thứ được gửi tới 192.168.1.2:8080 sẽ hiển thị trên thiết bị đầu cuối số 1 trên thiết bị đầu cuối số 2, gpg mã hóa mydocument.docx và các ống dẫn đến mèo nc 192.168.1.2 8080 gửi mydocument.docx được mã hóa đến thiết bị đầu cuối # 1 khi # 1 nhận được nó, nó giải phóng nó bằng gpg -d và lưu i
Fews1932

1

C ++

Đ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;
}

3
-1 (không thực sự), không đủ JQuery. Cũng kiểm tra lỗi quá nhiều. Tôi nghĩ bạn thậm chí đã đóng các tập tin! Gawd.

Tôi có thể biết JQuery đang đến!

1

Con trăn

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)

1

Toán học, 44 ký tự

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"]


Troll ở đâu? Tôi không biết Mathicala.

Đó là một câu trả lời cực kỳ nghiêm túc.
Chris Degnen

Oh. Bạn đã đọc các quy tắc cho Code trolling? codegolf.stackexchange.com/tags/code-trolling/info

Không chính xác, nhưng câu trả lời là vô lý kể từ khi tôi có thể đã sử dụng Mathematica của CopyFilechức năng.
Chris Degnen

1

DELPHI / PASCAL (sao chép từ F1.txt sang 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

MẶT NẠ

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

1

C ++

Bạn có nhận thấy bit "hoàn thành, hoạt động" không? Dù sao, đây là câu trả lời của tôi:

#include <stdlib.h>
int main(void)
{
  system("echo < input > dest");
}

1

Lua

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..


2
Mọi người một ngày nào đó sẽ có đủ những câu trả lời sau :( Tôi đã có.
Vereos

1

PHP

function copyFile($input, $output) 
{
    return file_put_contents($output, file_get_contents($input));
}

1

#! / thùng / sh

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, -ehoặ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" > outputbên dưới /bin/bashhoạ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.