unix의 text 파일은 줄바꿈이 "\n"이다.
윈도우에서 파일을 편집하고, vi로 열면 줄 마다 "\r"이 붙는다.
예전에 c로 허접하게 만들어 놓은 것을 사용하다가 ruby로도 한번 코딩해봤다.
ruby로 첫 산출물이다. ㅎㅎ
문법도 제대로 모르는 상태로 찾아가며 정말 허접하게 만들어 보았다.
라인수에서 차이가 엄청나게 난다.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
void removecr( char *buf )
{
int i, j;
int size = strlen(buf);
char *dest = new char[size+1];
memset( dest, 0, size +1 );
for(i=0, j=0; i<size; i++)
if( buf[i] != 0x0d )
dest[j++] = buf[i];
memcpy( buf, dest, size );
delete dest;
}
size_t getFileSize( char *file)
{
struct stat file_info;
if ( stat( file, &file_info) == -1 ) return -1;
return (size_t)file_info.st_size;
}
bool readFile(char *file, char *destBuf, size_t size)
{
int fp = 0;
size_t now=0, sum=0;
fp = open( file, O_RDONLY );
if ( fp == 0 ) return false;
while(sum<size)
{
now = read((int)fp, destBuf +sum, size -sum);
sum += now;
if ( now <= 0 ) break;
}
close(fp);
return true;
}
bool writeFile(char *file, char *srcBuf, size_t size)
{
int fp = 0;
size_t now=0, sum=0;
fp = open( file, O_WRONLY|O_CREAT );
if ( fp == 0 ) return false;
while(sum<size)
{
now = write((int)fp, srcBuf +sum, size -sum);
sum += now;
if ( now <= 0 ) break;
}
close(fp);
return true;
}
int main(int argc, char** argv)
{
if ( argc < 2 )
{
printf( "Usage: ./removecr [file1] {file2, file3, ...}\n");
return -1;
}
int i;
char *buf = 0;
size_t size;
for( i=1; i<argc; i++)
{
printf( "file %s processing...\t\t\t\t\t\t\t\t\t\r", argv[i] );
size = getFileSize( argv[i] );
if ( size <= 0 )
{
printf( "%s File Info", argv[i] );
perror("Error ");
return -1;
}
buf = new char[size+1];
memset( buf, 0, size +1 );
if( readFile( argv[i], buf, size ) == false )
{
printf( "%s File Read", argv[i] );
perror("Error ");
delete buf;
return -1;
}
removecr( buf );
unlink( argv[i] );
if ( writeFile( argv[i], buf, strlen(buf) ) == false )
{
printf( "%s File Write", argv[i] );
perror("Error ");
delete buf;
return -1;
}
delete buf;
printf( "file %s processing ok.\n", argv[i] );
}
}
#! /usr/bin/ruby
if ARGV.length == 0
puts "Usage: ./removecr [file1] {file2, file3, ...}\n"
else
for fn in ARGV do
if File.file?( fn )
File.rename(fn, fn+".bak");
rFile = File.open(fn+".bak", "r");
wFile = File.open(fn, "w");
rFile.each_line { |line| wFile.write( line.delete("\r") ) };
puts "[#{fn}] Remove CR Complete.\n";
else
puts "[#{fn}] Is Not File\n";
end
end
end