newtype
::: newtype의 지식창고 :::
newtype
전체 방문자
605,344
오늘
5
어제
7
  • 분류 전체보기 (390)
    • it (212)
      • c (43)
      • VB (5)
      • csharp (2)
      • java (2)
      • etc (32)
      • www (48)
      • emb (25)
      • win (4)
      • db (20)
      • sqlce (7)
      • devOps (8)
      • gmap (6)
      • python (2)
      • cygwin (2)
      • go (5)
      • ruby (1)
    • 명언 (10)
    • 모임 (18)
      • 붕주회 (3)
      • 신흥컴정 (14)
      • 웹20기 (1)
    • 사진 (8)
    • 불펌 (29)
    • 막글 (98)
    • 게임 (6)
    • 여행 (8)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

  • whoami
03-26 16:54
hELLO · Designed By 정상우.
newtype

::: newtype의 지식창고 :::

it/ruby

text 문서에서 Carriage return 제거

2007. 7. 3. 16:03
windows의 text 파일은 줄바꿈이 "\r\n"이고,
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



반응형
    Carriage return, CR, rmcr, Ruby
    newtype
    newtype
    지극히 개인적인 지식의 창고
    댓글쓰기

    티스토리툴바