한 파일에서 텍스트를 입력하고 다른 파일로 출력


13

도전 과제 :

한 파일에서 텍스트를 입력하고 다른 파일로 출력하십시오. 해결책은 완벽하고 작동하는 기능이어야합니다.

참고 : 이것은 질문입니다. 질문 및 / 또는 답변을 진지하게 받아들이지 마십시오. 자세한 내용은 여기를 참조 하십시오 .


공식 입장 에 따라 코드 트롤링을 제거하는 중 입니다. 이 질문에는 투표율이 매우 높은 하나의 답변이 포함되어 있습니다. 여론 조사 에서 50 %가 넘는 "삭제"투표를 받았지만 약 8 % 밖에받지 않았으므로 역사적 중요성을 위해이를 잠그고 있습니다.
Doorknob

답변:


40

여러 프로그래밍 언어를 사용하는 요점은 작업에 적합한 도구를 사용해야한다는 것입니다.
이 경우 한 파일에서 다른 파일로 바이트를 복사하려고합니다.
우리는 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과 같은 것들에 대한 쓰레기를 읽을 것이므로 초보자에게는 완전히 중국인이며 도움이 필요하다는 것을 깨달았을 때 그를 놀라게 할 것입니다.


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

1
당신을 위해 그 defs를 변경했습니다. 추가 혼란을 위해 함수 선언에서 동일하게 유지했습니다!

8
또한, 경우에 #define _ 1, 당신은 할 수 (;_;)는 웃는처럼 보이게하려면에 대한 루프와 함께.
Joe Z.

5
#define LOL fclose내 하루를
보냈다

1
#define LOL fclose, 결코 사용되지 않는 것은 나의 걸작입니다.

28

나는 이것의 단순함을 좋아한다.

echo File1.txt > File2.txt

File1.txt"File1.text" 가 포함 된 경우에만 제대로 작동합니다 ...


무엇이 잘못 되었나요?

4
@ user2509848 그것은으로 텍스트 "은 File2.txt"를두고 File2.txt이 아닌 실제 내용File1.txt
syb0rg

그러나 이것은 실제로 질문을 속이지는 않습니다 ...
jeremy

1
배쉬와 관련된 것이 없기 때문에 쉬울 수도 있습니다.
Kaya

1
이 KSH 수 있도록, 그는 그것을 얻을 수있는 곳을 파악해야합니다

8

오토 핫키

WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s

창 이름을 파일 이름으로 시작하는 메모장 또는 다른 텍스트 편집기에서 파일을 먼저 열어야합니다. 그런 다음 file1의 내용을 클립 보드에 복사하고 (문자를 사용하여 ctrl+ c) 파일 2에 붙여넣고 현재 파일을 덮어 쓰고 저장합니다.

문제를 해결하지만 매우 불편하고 쓸모없는 방식으로 해결합니다. 수동으로 복사하여 붙여 넣기가 더 쉬울 것입니다.


우수한! 선생님이 어떻게 생각하는지 궁금 하신가요?

6

모두 알고 있듯이 펄은 파일 조작에 매우 좋습니다. 이 코드는 한 파일의 내용을 다른 파일의 내용으로 복사하며, 여분의 중복성을 사용하여 측정합니다.

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

안전을 위해 처음에는 작은 파일로 테스트하십시오. 정확성을 확신하면 걱정없이 매우 큰 파일에 사용할 수 있도록 프로덕션 환경에 넣을 수 있습니다.


이 코드는 한 번만 출력하고 파일을 삭제 한 다음 첫 번째 출력 파일에서 다시 출력하려고합니까?

3
첫 번째 패스는 이전 파일의 첫 문자를 새 파일에 씁니다. 두 번째로 새 파일을 삭제하고 이전 파일의 처음 두 문자를 새 파일에 씁니다. 세 번째, 세 문자 등. 중복 될뿐만 아니라 컴퓨터가 충돌 할 경우 부분 파일을 가질 수 있습니다!
dms

6

씨#

이를 달성하려면 몇 가지 작업을 수행해야합니다.

  1. 파일에서 문자열 읽기
  2. Visual Studio 용 Microsoft 파일 IO 및 문자열 확장명 다운로드
  3. 문자열에서 바이러스 제거 ( "sanitize")
  4. 경로에 파일 쓰기
  5. 캐시 삭제 및 새로 고침

코드는 다음과 같습니다.

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

간단한 네 단계로 :

  1. 파일을 인쇄하십시오. lpr이 명령을 사용할 수 있습니다 .
  2. 출력물을 스캔 서비스로 우송하십시오. (우송료가 필요합니다).
  3. 스캔 서비스는 출력물을 스캔하고 OCR을 수행합니다.
  4. 적절한 파일 위치로 다운로드하십시오.

쓸모없는 답변을 만드는 좋은 직업!

이 RFC1149는 호환됩니까?
Mark K Cowan

@ user2509848 나는 대답 대신 쓸모없는 직업을 만드는 좋은 직업을 말할 것입니다 ...
Kiwy

4

자바

많은 사람들이 정규 표현식을 사용하거나 한 파일에서 다른 파일로 문자열을 복사하기 위해 문자열을 평가하는 것이 유용하지만 프로그래밍 방법이 느리다는 것을 알고 있습니다. 먼저 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());
    }



}

이론적으로 (테스트하지 않았습니다) 이것은 사용자가 첫 번째 파일의 내용 (단어별로)을 수동으로 입력 한 다음 두 번째 파일에 씁니다. 이 응답은 "한 파일에서 텍스트 입력"이라는 의미에 대한 질문의 모호성에 대한 연극이며 미친 변수 이름 (임의로 생성)은 약간의 재미를위한 것입니다.


2
나는 이것과 비슷한 것을 만들려고 생각했습니다 ... 한 파일 의 부분 입력 텍스트를 잘못 해석 하지는 않지만 수학자의 접근 방식에 따라 문제를 이미 해결 된 것으로 줄였습니다. => 화면 입력 처리. 그래도 좋은 해결책을 찾지 못했습니다 ...
Kiruse

3

@Shingetsu가 지적한 것처럼 올바른 작업에 적합한 도구를 사용해야합니다. 한 파일에서 다른 파일로 내용을 복사하는 것은 오래된 문제이며 이러한 파일 관리 작업을위한 가장 좋은 도구는 셸을 사용하는 것입니다.

모든 프로그래머가 자신에게 익숙해 져야하는 하나의 쉘 명령 은 파일의 내용을 하나씩 함께 다루는tac 데 사용되는 공통 명령 입니다. 특별한 경우로, 하나의 파일 만 전달 될 때 다시 그대로 그대로 뱉어집니다. 그런 다음 출력을 적절한 파일로 리디렉션합니다.

tac inputfile.txt >outputfile.txt

간결하고 포인트가없는 트릭!


2

바이러스 백신이 포함되어 있습니다.

#!/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"};

매우 흥미 롭습니다. 방금 바이러스를 검사하는 척합니까?

1
아니요, 파일에서 V, I, R, U, S 문자 만 제거합니다.
craftext

오. "바이러스 제거"라고 말하면 'E'도 제거해야합니다.

2
사실입니다. 그러나 실제로 바이러스를 제거하려면 search.cpan.org/~converter/Mail-ClamAV-0.29와 같은 CPAN 모듈이 있습니다.
craftext

2

윈도우 배치

(이것은 아마도 "죽은"언어를 가져야하기 때문에 ;-)

@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
AMK

제목을 업데이트했습니다.
Isiah Meadows

2

링크

효율성은 중요하지 않으며 정확성은 중요합니다. 기능적 스타일로 작성하면 오류가 발생하기 쉬운 코드가 더 명확 해집니다. 성능에 문제가있는 경우 마지막 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();
}

2

잡담

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

1

세게 때리다

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 이상,


코드를 표시 할 수 있습니까?

초보자 메신저, 그러나 여기 간다 NC -l 8080 GPG를 암호화 mydocument.docx 터미널 # 2에 터미널 1에 표시됩니다 192.168.1.2:8080에 포트 8080 아무것도하여 전송에서 수신하도록 netcat을 알려줍니다, 및 파이프에 그 넷캣. nc 192.168.1.2 8080 은 # 1이 수신하면 암호화 된 mydocument.docx를 터미널 # 1로 전송하고 gpg -d로 암호화를 해제하고 i를 저장합니다.
Fews1932

1

C ++

이것은 신 게츠의 답변 에 다소 근거하고 있지만 저항 할 수는 없었습니다. 그것은 완벽하게 기능하지만 학생은 선생님에게 제출하지 않을 것입니다. 코드를 기꺼이 분석하려는 경우 문제를 해결할 수 있습니다.

#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 (실제로는 아님), JQuery가 충분하지 않습니다. 너무 많은 오류 검사. 파일을 닫았다 고 생각합니다! 멍청 아

JQuery 가오 고 있음을 알 수있었습니다!

1

파이썬

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)

1

매스 매 티카, 44 자

이행

f = (BinaryWrite[#2, BinaryReadList@#]; Close@#2) &

실행

f["one file", "another"]

검사

check = Import[StringJoin["!diff \"", #, "\" \"", #2, "\" 2>&1"], "Text"] &;
check["one file", "another"]


트롤은 어디에 있습니까? 나는 Mathematica를 모른다.

엄청나게 심각한 답변입니다.
Chris Degnen

오. 코드 트롤링 규칙을 읽었습니까? codegolf.stackexchange.com/tags/code-trolling/info

정확하지는 않지만 MathematicaCopyFile기능을 사용할 수 있었기 때문에 대답은 터무니 없습니다 .
Chris Degnen

1

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.

1

마스

나는 확실히 어셈블리 전문가는 아니지만 아래는 내 작은 스 니펫입니다.

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

"완전하고 작동하는 기능"비트를 보셨습니까? 어쨌든 내 대답은 다음과 같습니다.

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

1

루아

io.read()

가 포함 된 입력 파일로 실행하십시오 text from one file and output it to another. Solution should be a complete, working function..


2
언젠가는이 답변을 충분히해야합니다 사람들은 :( 이미 있었다.
Vereos

1

PHP

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

1

#! / bin / sh

contents=`< $1` ; echo "$contents" > $2

파일이 크면 합리적이지만 다소 비효율적입니다.

입력 파일에 포함 된 경우를 제외하고는 ASCII 파일에 잘 작동 -n, -e또는 -E. (이것들은에 의해 인수로 해석되기 때문에 echo.)

모든 (대부분) 이진 파일에 대해 올바른 출력을 생성하지 않습니다.

( printf "%s" "$contents" > outputunder를 사용 /bin/bash하면 조금 더 잘 작동하지만 여전히 NULL 바이트를 삭제합니다.)

물론 파일 이름 포함 파일 공간에서는 작동하지 않습니다. 그러나 이러한 파일은 UNIX % 정책에 따라 불법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.