c언어 파일입출력 질문드립니다

doremii의 이미지

리눅스상에서 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);
}
세벌의 이미지

에러가 언제 나는가요?
컴파일 할 때? 실행할 때?
에러 메시지는 무엇인가요?

https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
잘 읽어보고 질문하면 좀 더 좋은 답을 얻을 겁니다.

doremii의 이미지

위의 코드로 컴파일 시 에러가 납니다. 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할 별도의 파일을 오픈해서 사용하시면 됩니다.

shint의 이미지

//웹 컴파일 오류는 없는 소스
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

doremii의 이미지

위의 코드로 컴파일 시 에러가 납니다. while(fgets(str,sizeof(str),fp)!= NULL)의 fgets를 파일포인터 선언 없이 사용하여 에러가 난 것 같습니다.
fgets를 사용하지 않고 open한 texti파일을 buf배열에 저장하여 while문 블럭으로 파일의 모든 문장을 대문자로 변경하려고 합니다.
buf배열에 texti파일을 저장하면 while문을 적용할 수 있을거 같은데 어떻게 해야할지 갈피를 잡지 못해 도움 요청하려 글 올립니다ㅜㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.