13
2
The challenge:
Input text from one file and output it to another. Solution should be a complete, working function.
Note: This is a code-trolling question. Please do not take the question and/or answers seriously. More information here.
13
2
The challenge:
Input text from one file and output it to another. Solution should be a complete, working function.
Note: This is a code-trolling question. Please do not take the question and/or answers seriously. More information here.
40
The whole point of having multiple programming languages, is that you need to use the right tool for the job.
In this case, we want to copy bytes from one file to another.
While we could use something fancy like bash or ruby, or fall to the power of ASM, we need something quick, good with bits and fast.
The obvious choice is C.
The SIMPLEST way of doing it would be like so:
#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_;
}
This is evil because it will read garbage on things like cygwin, is completely chinese for a beginner, will scare him when he realizes it's a call for help and, obviously, because C.
8#define VERY filename1
#define NOT filename2
– Joe Z. – 2013-12-28T05:01:12.970
Great job! You made me laugh with those names! – None – 2013-12-28T05:01:20.543
You could also use #define USUALLY filename2
, depending on your disposition at the time. – Joe Z. – 2013-12-28T05:03:07.747
1Changed those defs for you. I kept them the same on the function declaration for MORE confusion! – None – 2013-12-28T05:04:09.170
8Also, if you #define _ 1
, you can make (;_;)
with the for-loop, to make it look like a smiley. – Joe Z. – 2013-12-28T05:14:16.253
I don't know... it won't be better than the $$
trick I did on the RNG question. – None – 2013-12-28T05:15:18.083
5#define LOL fclose
made my day – thwd – 2013-12-28T13:04:54.893
We all know calling fclose is never necessary... That's why I never actually call it, the macro is there for good practice. – None – 2013-12-28T16:53:17.237
I read NEVER (;_;)
as "NEVER CRY". Brilliant. – Justin – 2014-01-14T05:46:39.307
1#define LOL fclose
, which is never used is my masterpiece though. – None – 2014-01-17T15:41:42.300
I just keep getting +1s here. wow. – None – 2014-01-23T23:30:46.730
28
I like the simplicity of this one.
echo File1.txt > File2.txt
Really only works properly if File1.txt
contains "File1.text"...
What is wrong with it? – None – 2013-12-28T04:25:36.813
4@user2509848 It puts the text "File1.txt" into File2.txt
, not the actual contents of File1.txt
– syb0rg – 2013-12-28T04:35:19.320
But this doesn't actually cheat the question... – jeremy – 2013-12-28T04:49:14.577
@Jeremy It's meant to look convincing and deceive the asker (which it did in this case), not actually carry out the task. – syb0rg – 2013-12-28T04:50:49.353
1Could just as well be sh as there isn't anything bash specific. – Kaya – 2013-12-28T04:58:38.487
1make it ksh, he'll have to figure out where to get it – None – 2013-12-28T05:01:55.907
@Kaya True, I changed my answer to reflect that. – syb0rg – 2013-12-28T05:07:35.957
@syb0rg you say it doesn't copy the contents. t big deal.. so type file1.txt >file2.txt
or copy. maybe i'm missing something. – barlop – 2013-12-28T21:49:08.407
@barlop It's not supposed to be a big deal... this is a code-troll. – syb0rg – 2013-12-28T22:16:36.337
Changing the echo
to a cat
would do the job. – Martijn Courteaux – 2013-12-29T11:48:29.550
sh? That would even work on windows! (or type
for cat
) – Mark K Cowan – 2014-01-24T14:34:59.570
8
WinActivate, file1.txt
SendInput ^a^c
WinActivate, file2.txt
SendInput ^a^v^s
You must first open the files in notepad or some other text editor that makes the window names start with the file names. Then it copies the contents of file1 to the clipboard (literally, using ctrl+c), and pastes it into file2, overwriting anything currently in it, and saves.
Solves the problem, but in a very inconvenient and pretty useless fashion. It would probably by easier to just copy and paste manually.
Excellent! I wonder what the teacher would think? – None – 2013-12-28T15:40:12.737
6
As everyone knows, perl is very good for manipulating files. This code will copy the contents of one file to another, and will do so with extra redundancy for good measure.
#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);
}
}
To be safe, test this out on a small file at first. Once you are convinced of its correctness you can put it into production for use on very large files without worry.
Does this code output it once, destroy the file, then try to output it again from the first output file? – None – 2013-12-28T06:31:07.377
3The first pass through it writes the first character of the old file to the new file. The second time through it deletes the new file and writes the first two characters of the old file to the new file. The third time, three characters, etc. etc. Not only is it redundant, but if your computer crashes you will (possibly) have a partial file! – dms – 2013-12-28T07:06:34.833
6
C#
In order to achieve this, you must make sure to do several things:
Here's the code:
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
In four simple steps:
lpr
command for this.Good job creating a useless answer! – None – 2013-12-28T15:40:56.177
Is this RFC1149 compatible? – Mark K Cowan – 2014-01-24T14:36:35.390
@user2509848 I would say good job creating useless job instead of answer... – Kiwy – 2014-01-27T11:14:32.063
4
A lot of people find it useful to attempt to use regular expressions or to evaluate strings in order to copy them from one file to another, however that method of programming is sloppy. First we use Java because the OOP allows more transparency in our code, and secondly we use an interactive interface to receive the data from the first file and write it to the second.
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());
}
}
In theory (I haven't tested it) this makes the user manually input the content of the first file (word by word) and then writes it to the second file. This response is a play on the ambiguity of the question as to what it means by "input text from one file," and the crazy variable names (generated randomly) were just for some extra fun.
2I was thinking about making something similar to this... not misinterpreting the part input text frome one file, but following a mathematician's approach saying I've reduced the problem to an already solved one. => handling screen input. Didn't come up with a good solution though... – Kiruse – 2013-12-28T12:00:52.630
3
Like @Shingetsu pointed out, one has to use the right tool for the right job. Copying the content from one file to another is an old problem, and the best tool for such file-management tasks is using the shell.
One shell command that every programmer has to familiarise themself with is the common tac
command, used to tack the content of files together, one after another. As a special case of this, when only one file is passed in it is simply spit out as-is again. We then simply redirect the output to the appropriate file:
tac inputfile.txt >outputfile.txt
Simple and to-the-point, no tricks!
2
Antivirus included.
#!/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"};
Very interesting, does it just pretend to check for viruses, or does it really do it? – None – 2013-12-28T18:03:30.273
1No, it only removes the letters V, I, R, U, S from the file. – craftext – 2013-12-28T18:06:23.593
Oh. Since you say "removing viruses", maybe you should remove 'E' too. – None – 2013-12-28T18:07:47.493
2
That's true. But if you want to really remove viruses, there is a CPAN module to do that: http://search.cpan.org/~converter/Mail-ClamAV-0.29/.
– craftext – 2013-12-28T18:12:26.6302
(because you gotta have this supposedly "dead" language ;-)
@echo off
setlocal enabledelayedexpansion
for %%I in ('type %1') do set this=!this!%%I
echo !this!>%2 2>nul
You simply call this as copy.bat file1.txt file2.txt
(or whatever files you want)
If only it would keep line breaks...
setlocal enabledelayedexpansion
and set thisline=!thisline!%%I
works only in Windows CMD. In DOS must work simple set thisline=%thisline%%%I
– AMK – 2014-01-14T17:19:02.530
I updated the title. – Isiah Meadows – 2014-01-18T02:29:10.610
2
Efficiency is not important, correctness is. Writing in a functional style results in more clear and less error-prone code. If performance does turn out to be a problem, the last ToArray() line can be omitted. It's better to be lazy anyway.
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
There is a library yet ported to several Smalltalk dialects (Visualworks, Gemstone Squeak/Pharo, ...) named Xtreams that makes this task more than easy.
FileStream would be as simple as 'foo' asFilename reading
and 'bar' asFilename writing
for example in Visualworks, but are dialect specific.
For this reason I demonstrate the algorithm with dialect neutral internal Streams instead.
A good idea could be to process each byte code in increasing order:
| 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
Of course, it is also possible to process in random order, but i'm afraid that it makes the code a bit too compact:
| 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
EDIT
Ah stupid me, I didn't saw the log2 solution:
| 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
This is somewhat based on Shingetsu's answer, but I couldn't resist. It is fully functioning, but no student would submit it to their teacher (I hope). If they are willing to analyze the code, they will be able to solve their problem:
#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 (not really), not enough JQuery. Also too much error checking. I think you even closed the file! Gawd. – None – 2013-12-28T16:57:22.473
I could have known JQuery was coming up! – None – 2013-12-30T03:23:35.953
1
on terminal #1 with the IP, 192.168.1.2
nc -l 8080 | gpg -d > mydocument.docx
on terminal #2 with the IP, 192.168.1.3
gpg -c mydocument.docx | nc 192.168.1.2 8080
This will encrypt and send mydocument.docx
, using nc
and gpg
, over to terminal #1
You will have to type the password on terminal #2, then on terminal #1
Can you mark the code? – None – 2013-12-28T21:48:17.087
im a newbie, but here goes, nc -l 8080 tells netcat to listen on port 8080. anything sent to 192.168.1.2:8080 will show up on terminal #1 on terminal #2, gpg encrypts mydocument.docx, and pipes that to netcat. nc 192.168.1.2 8080 sends the encrypted mydocument.docx over to terminal #1 when #1 recieves it, it unencrypts it with gpg -d , and saves i – Fews1932 – 2013-12-28T22:04:13.000
1
Inputs text from file1.txt and outputs it to file2.txt
It's complete and "working". No one said anything about writing the input as it is. All input characters appear in the output. "getchar" is the trolling part.
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
Implementation
f = (BinaryWrite[#2, BinaryReadList@#]; Close@#2) &
Execution
f["one file", "another"]
Check
check = Import[StringJoin["!diff \"", #, "\" \"", #2, "\" 2>&1"], "Text"] &;
check["one file", "another"]
Where is the troll? I do not know Mathematica. – None – 2014-01-03T22:56:51.263
It's a ridiculously serious answer. – Chris Degnen – 2014-01-03T23:14:10.130
Oh. Did you read the rules for Code trolling? http://codegolf.stackexchange.com/tags/code-trolling/info
– None – 2014-01-04T01:34:57.160Not exactly, but the answer is absurd since I could have used Mathematica's CopyFile
function. – Chris Degnen – 2014-01-04T01:43:42.303
1
DELPHI / PASCAL ( copy from f1.txt to 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
I'm certainly not an assembly expert, but below is my little snippet:
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
PHP
function copyFile($input, $output)
{
return file_put_contents($output, file_get_contents($input));
}
1
Did you notice the "complete, working function" bit? Anyway, here is my answer:
#include <stdlib.h>
int main(void)
{
system("echo < input > dest");
}
1
io.read()
Run with an input file containing text from one file and output it to another. Solution should be a complete, working function.
.
2People one day will have enough of these answers :( I already had. – Vereos – 2014-01-24T15:42:55.533
1
contents=`< $1` ; echo "$contents" > $2
Looks reasonable, but rather inefficient if the file is large.
Works fine on ASCII files except when the input file contains -n
, -e
or -E
. (Because these are interpreted as arguments by echo
.)
Does not produce the correct output for all (most) binary files.
(Using printf "%s" "$contents" > output
under /bin/bash
works a little better, but that still drops NULL bytes.)
Oh and of course it doesn't work for filenames_containing_spaces. But such files are illegal under UNIX%20policy anyway.
Code-trolling is in the process of being removed, as per the official stance. This question has a fair amount of votes with one extremely highly voted answer. It recieved just slightly over 50% "delete" votes on the poll, but only by about 8%, so I am locking it for historical significance.
– Doorknob – 2014-05-12T12:46:46.460