기본적인건데 제가 잘 모르겠네요...;; 간단한거니까 다들 봐주시고 답변좀 주세요 ㅠ
글쓴이: jmonaco88 / 작성시간: 목, 2012/12/06 - 3:29오후
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(int argc, char *argv[]) 5 { 6 FILE *fp; 7 char ch; 8 long l; 9 10 if(argc != 2){ 11 printf("You must specify the file\n"); 12 exit(1); 13 } 14 15 if((fp = fopen(argv[1], "rb")) == NULL){ 16 printf("cannot open file"); 17 exit(1); 18 } 19 20 fseek(fp, 0, SEEK_END); 21 l = ftell(fp); 22 23 fseek(fp, 0, SEEK_SET); 24 for( ; l>=0; l = l - 2L){ 25 ch = fgetc(fp); 26 putchar(ch); 27 fseek(fp, 1L, SEEK_CUR); 28 } 29 30 fclose(fp); 31 32 return 0; 33 }
소스내용은 간단합니다. 파일에있는 내용들을 홀수바이트 문자는 프린트해주고 짝수는 건너띄는 소스입니다.
근데 여기서 2L과 1L이 뭔지 도무지 모르겠네요 ;;;;
조언좀 부탁드립니다.
Forums:
음 ..
integer constant suffix 로 검색해 보세요.
http://c0x.coding-guidelines.com/6.4.4.1.html
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
저도 따라 해봤는데요.
지저분하지만. 개발한 기록과 주석 모두 첨부합니다.
[%
//참고한 링크
//http://kldp.org/node/135343
//http://www.cplusplus.com/reference/cstdio/fgetc/
//http://www.cplusplus.com/reference/cstdio/fgets/
//http://cafe.naver.com/cafec/261386
//http://dragonseop.tistory.com/15
//http://cafe.naver.com/cafec/40790
//http://blog.naver.com/kjkchun4/110037219356
//http://sadohc.net/7
//http://itguru.tistory.com/51
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#define MSVCR100
typedef struct DF_ST
{
char a;
char b;
char c;
char d;
}ST;
//#ifndef _FILE_DEFINED
//struct _iobuf {
// char *_ptr;
// int _cnt;
// char *_base;
// int _flag;
// int _file;
// int _charbuf;
// int _bufsiz;
// char *_tmpfname;
// };
//typedef struct _iobuf FILE;
char* fn_str(char* p, int cnt)
{
if(cnt == 0)
return NULL;
p[cnt] = '\0';
return p;
}
void fn_io(_iobuf* io)
{
// _iobuf* io;
// io = fp;
// printf("--------------------------------------------------------------------------\n");
// printf("[%c]\n", ch);
// printf("--------------------------------------------------------------------------\n");
printf("CNT:%d\t", io->_cnt);
printf("FLAG:%d\t", io->_flag);
printf("FILE:%d\t", io->_file);
printf("CHARBUF:%d\t", io->_charbuf);
printf("BUFSIZE:%d\t", io->_bufsiz);
printf("TMP_FNAME:%s\n", io->_tmpfname);
printf("PTR:\n%s \n", fn_str(io->_ptr, io->_cnt));
printf("\n");
printf("BASE:\n%s\n", io->_base);
printf("\n");
}
//http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10302&docId=64889941&qb=X2R1cCBpbw==&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0
//http://batt22.tistory.com/31
//http://yhcting.tistory.com/211
//http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/9c6ecc5f-2294-479d-8827-49068c3b1802
//http://blog.naver.com/gloryo?Redirect=Log&logNo=110118055436
//HANDLE GetFileHandleFromFILE(FILE* pFile)
//{
// DWORD offset = pFile->_file << 6;
// HANDLE handle = *(PHANDLE)(offset + __pioinfo);
// return handle;
//}
//해결방법은 STLport를 컴파일 할 때, fstream.cpp의 extern _CRTIMP ioinfo * __pioinfo; 이부분에
//서 extern을 제거한 후 컴파일을 하면 된다. 하지만 그 나름대로 문제가 또 있다. CMT를 써게 되는
//경우라면 또 원래의 .lib를 이용해야 하는 것이다. (아니 이런 귀차니즘이;;)
//다른 방법으로는 stl_user_config.h의 #define _STLP_NO_OWN_IOSTREAMS 1 의 주석을
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
long l;
long max;
//http://madprog.tistory.com/33
//FILE str;
//REG1 FILE* infile = &str;
if(argc != 2)
{
printf("You must specify the file\n");
exit(1);
}
if((fp = fopen(argv[1], "rb")) == NULL)
{
printf("cannot open file");
exit(1);
}
//최대 파일 크기를 구한다.
fseek(fp, 0, SEEK_END);
max = ftell(fp);
//처음으로 이동한다.
fseek(fp, 0, SEEK_SET);
//for
//첫번째 인자 : 변수 초기화
//두번째 인자 : 조건문
//세번째 인자 : 증가값
//for( ; l>=0; l = l - 2L) 은
//for( ; l>=0; )
//{
// l = l - 2L; 과 같습니다.
//}
//int n = feof(fp);
//if(n != 0)
//{
// printf("\nfeof[%d]\n", n);
// break;
//}
printf("홀수 보여주기\n");
l = 0;
while(1)
{
ch = fgetc(fp);
printf("fgetc [%c]\n", ch);
l = l+2;
if(l >= max)
{
printf("\nend[%d]\n", l);
break;
}
fseek(fp, l, SEEK_SET);
Sleep(100);
}
//TEST_CODE
// printf("짝수만 보여주기\n")
// l = 1;
// char ca[10];
// memset(ca, '\0', 10);
// fseek(fp, l, SEEK_SET);
// while(1)
// {
//
// fn_io(fp);
//
// ch = fgetc(fp);
//// fread(&ch, 1, 1, fp);
//// fscanf(fp, &ch);
//// fputc(ch, stdout);
//// fgets(&ca[0], 10, fp);
//
// STDOUT_FILENO
//
// //http://yhcting.tistory.com/211
//// int fd = _dup(fileno(stdout));
//// _dup2(fd, fileno(stdout));
//
// printf("--------------------------------------------------------------------------\n");
//// fputc(ch, stdout);
//// printf("fgetc [%c]\n", &ca[0]);
// printf("fgetc [%c]\n", ch);
//// fputs(ch, fp); <-- stdout과 fp에 주의하자.
// printf("--------------------------------------------------------------------------\n");
//
//
//
// //http://blog.naver.com/gloryo?Redirect=Log&logNo=110118055436
//// HANDLE file = (HANDLE)fileno(fp);
//// char buffer[1024] = {0};
//// DWORD readBytes = 0;
//// ReadFile(file, buffer, sizeof(buffer), &readBytes, NULL);
//// printf("buffer : %s\n", buffer);
//// fclose(pFile);
//
//
// l = l+2;
// if(l >= max)
// {
// printf("\nend[%d]\n", l);
// break;
// }
// //http://blog.naver.com/cosmo1492?Redirect=Log&logNo=120121883721
// fseek(fp, l, SEEK_SET);
//
// Sleep(100);
// }
printf("짝수만 보여주기\n");
l = 1;
fseek(fp, l, SEEK_SET);
while(1)
{
ch = fgetc(fp);
fputc(ch, stdout); fputc('\n', stdout);
// printf("fgetc [%c]\n", ch);
l = l+2;
if(l >= max)
{
printf("\nend[%d]\n", l);
break;
}
fseek(fp, l, SEEK_SET);
Sleep(100);
}
printf("홀수만 거꾸로 보여주기\n");
l = max-1;
fseek(fp, l, SEEK_SET);
while(1)
{
ch = fgetc(fp);
// fputc(ch, stdout); fputc('\n', stdout);
printf("fgetc [%c] [pos:%d]\n", ch, l);
l = l-2;
if(l < 0)
{
printf("\nend[%d]\n", l);
break;
}
fseek(fp, l, SEEK_SET);
Sleep(100);
}
printf("짝수만 거꾸로 보여주기\n");
l = max-2;
fseek(fp, l, SEEK_SET);
while(1)
{
ch = fgetc(fp);
// fputc(ch, stdout); fputc('\n', stdout);
printf("fgetc [%c] [pos:%d]\n", ch, l);
l = l-2;
if(l < 0)
{
printf("\nend[%d]\n", l);
break;
}
fseek(fp, l, SEEK_SET);
Sleep(100);
}
return 0;
//12345
//67890
for( ; l>=0; ) //0일때까지 반복.
{
int n = feof(fp);
if(n != 0)
{
printf("feof[%d]\n", n);
break;
}
// l = l - 2L;
printf("\n-----%d\n", l);
ch = fgetc(fp);
// fputc(ch, stdout);
putchar(ch);
// int n;
// memcpy(&n, (void*)fgetc(fp), 4);
// fflush(fp);
// char c1;
// char c2;
// memcpy(&c1, &n, 1);
// memcpy(&c2, &n+1, 1);
// printf("%c\n", c1);
// printf("%c\n", c2);
// ST st;
// memcpy(&st, &n, 4);
//
// printf("%c\n", st.a);
// printf("%c\n", st.b);
// printf("%c\n", st.c);
// printf("%c\n", st.d);
// fseek(fp, l, SEEK_CUR);
}
fclose(fp);
return 0;
}
//
//출력 결과
//
//홀수 보여주기
//fgetc [1]
//fgetc [3]
//fgetc [5]
//fgetc [7]
//fgetc [9]
//
//end[10]
//짝수만 보여주기
//2
//4
//6
//8
//
//end[9]
//홀수만 거꾸로 보여주기
//fgetc [9] [pos:8]
//fgetc [7] [pos:6]
//fgetc [5] [pos:4]
//fgetc [3] [pos:2]
//fgetc [1] [pos:0]
//
//end[-2]
//짝수만 거꾸로 보여주기
//fgetc [8] [pos:7]
//fgetc [6] [pos:5]
//fgetc [4] [pos:3]
//fgetc [2] [pos:1]
//
//end[-1]
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
보니까..
파일 크기의 반만 출력하는 코드 같은데요? 홀수바이트만 출력하는게 아니라..
ㅎㅎㅎ 생각하기에 따라 그렇네요
홀수번째만 출력이 되니까 짝수번째마다 출력되야하는게 날라가겠죠??
그러면 파일 크기의 반만 출력하는 코드라고 말해도 되는거죠~ 표현의 차이같네요 ㅎ
댓글 달기