c언어 파일입출력 질문드립니다
글쓴이: doremii / 작성시간: 목, 2017/11/02 - 11:02오후
리눅스상에서 c언어 공부중입니다
다름이 아니라 open,write함수를 이용하여
Hi Hello.
Have a goodtime. 같이 여러 줄이 쓰여진 문장이 있는 texti라는 텍스트파일을 open함수로 연 후,
모두 대문자로 변환하여 같은 texti파일에 쓰려고 합니다
아래와 같이 코드를 짰는데 오류가 나네요ㅜㅜ fp로 open한 파일을 buf배열에 저장하여 사용하고 싶은데
어떻게 고쳐야 할 지 도움 부탁드립니다ㅜㅜ
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> int main() { int fp,i; char buf[300]; if((fp=open("texti",O_RDWR)) == 0) { perror("open: "); exit(0); } while(fgets(buf,sizeof(buf),fp)!= NULL) { for(i=0; i<strlen(buf); i++) { if((buf[i] >= 'a') && (buf[i] <= 'z')) { buf[i] -= ('a'-'A'); } } write(fp,buf,sizeof(buf)); } close(fp); }
Forums:
에러가 언제 나는가요?
에러가 언제 나는가요?
컴파일 할 때? 실행할 때?
에러 메시지는 무엇인가요?
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
잘 읽어보고 질문하면 좀 더 좋은 답을 얻을 겁니다.
세벌 https://sebuls.blogspot.kr/
답변 감사합니다.링크내용 숙지한 후 다시 질문드립니다.
위의 코드로 컴파일 시 에러가 납니다. while(fgets(str,sizeof(str),fp)!= NULL)의 fgets를 파일포인터 선언 없이 사용하여 에러가 난 것 같습니다.
fgets를 사용하지 않고 open한 texti파일을 buf배열에 저장하여 while문 블럭으로 파일의 모든 문장을 대문자로 변경하려고 합니다.
buf배열에 texti파일을 저장하면 while문을 적용할 수 있을거 같은데 어떻게 해야할지 갈피를 잡지 못해 도움 요청하려 글 올립니다ㅜㅜ
음. 하나의 파일을 읽고 바로 그 파일에 쓰시는 군요
음. 하나의 파일을 읽고 바로 그 파일에 쓰시는 군요.
fgets() fwrite()로 파일을 접근할 때 (사실은 모든 파일 접근시) 파일 내용의 위치 정보를 사용합니다.
그 정보는 예를 들면 SEEK_SEK, SEEK_CUR, SEEK_END 등과 같은 것입니다.
fgets(), fwrite()를 사용할 때마다 SEEK_CUR 정보가 업데이트됩니다. 따라서 그것을 염두해 두시고 코딩하셔야 합니다. fgets(), fwrite 할 때마다 SEEK_CUR를 프린해 보세요.
또는 write할 별도의 파일을 오픈해서 사용하시면 됩니다.
참고해보세요.
//웹 컴파일 오류는 없는 소스
https://ideone.com/tNdlOu
http://codepad.org
웹 컴파일러는 파일 입출력 함수는 잘 안되는거 같네요.
//잘되는 블로그 책 예제소스 참고
[C언어 소스] 대소문자 변환
http://ehclub.tistory.com/1146
//
묵시적형 변환
FILE*p;
int n = k;
명시적 형변환
FILE*p;
int n = (int) p;
//
strlen() 문자열 갯수
sizeof() 배열 크기
//한줄씩 주석 처리하거나 지워서 오류가 나는곳을 printf() 등으로 출력해서 확인
Visual Studio 라면. F9 F10 F5 로 디버깅하며 확인
//배열의 범위를 넘는지 소스 코드를 확인
//각 함수에 인자값. 리턴값. 오류값 확인
https://linux.die.net/man/3/open
int open(const char *path, int oflag, ... );
https://linux.die.net/man/3/write
ssize_t write(int fildes, const void *buf, size_t nbyte);
write((int)fp,buf,sizeof(buf));
https://linux.die.net/man/3/read
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
ssize_t read(int fildes, void *buf, size_t nbyte);
https://linux.die.net/man/3/close
int close(int fildes);
https://linux.die.net/man/3/fopen
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
http://www.cplusplus.com/reference/cstdio/fgets/
char * fgets ( char * str, int num, FILE * stream );
https://linux.die.net/man/3/fwrite
size_t fread(void *ptr, size_t size, size_t nmembFILE *" stream );
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
https://linux.die.net/man/3/fread
size_t fread(void *ptr, size_t size, size_t nmembFILE *" stream );
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
https://linux.die.net/man/3/fclose
int fclose(FILE *fp);
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
음?
음?
open으로 열고 fgets으로 읽고 있는데 아무도 지적하지 않으시는군요.
그 둘은 서로 어울리지 않습니다. open에 어울리는 걸 찾고 싶으시면 read를 알아보세요.
https://linux.die.net/man/3/read
감사합니다 답변 숙지하였습니다 다시 질문 드리겠습니다.
위의 코드로 컴파일 시 에러가 납니다. while(fgets(str,sizeof(str),fp)!= NULL)의 fgets를 파일포인터 선언 없이 사용하여 에러가 난 것 같습니다.
fgets를 사용하지 않고 open한 texti파일을 buf배열에 저장하여 while문 블럭으로 파일의 모든 문장을 대문자로 변경하려고 합니다.
buf배열에 texti파일을 저장하면 while문을 적용할 수 있을거 같은데 어떻게 해야할지 갈피를 잡지 못해 도움 요청하려 글 올립니다ㅜㅜ
댓글 달기