c언어 파일입출력 질문 진짜 모르겠어서 올려봅니다

math2513의 이미지

South Korea's intelligence agency said on Thursday that the country has joined a cyber defense group under the North Atlantic Treaty Organization (NATO), becoming its first Asian member country.
The National Intelligence Service (NIS) said that South Korea, along with Canada and Luxembourg, have been admitted into the NATO Cooperative Cyber Defense Centre of Excellence (CCDCOE), a think-tank based in Tallinn, Estonia, that supports member nations and NATO with interdisciplinary cyber defense research, training, and exercises.
The think-tank was established in 2008 by NATO members, on the initiative of Estonia, in response to the country suffering crippling cyberattacks allegedly committed by Russia.
이게 txt파일에 들어가는 내용이고
이 txt파일 이름이 input인데 이때
이 input..txt 파일을 열고 한줄씩 단위로 읽어서 다음의 포이터 배열에 각 요소로 기록
char * input[10];
input 배열의 각 요소는 동적 메모리 할당받는 함수를 활용하여 동적으로 할당 받는다
각줄의 문자열을 위하여 동적으로 할당 받는 배열의 크기는 문자 개수로 400개면 충분하다
문자을을 담는 배열을 가리키는 포인터는 char *line을 활용

FILE * FP;
fp= 파일 여는 함수("input.txt","r");
성공적으로 파일이 열린 경우
{
파일 내의 각 줄의 문자열에 대해서
{
line = 동적 메모리 할당 함수(400 *sizeof(char));
동적 메모리 할당이 성공적으로 된 경우
{
line = 파일 내의 한 문자얼을 읽는 함수(fp);
input 문자열 배열에 방금 읽은 line 문자열을 저장함
}
}
//파일 내의 모든 문자열 입력이 완료되면
input 문자열 배열의 문자열들을 화면에 표출함
input 문자열 배열의 문자열에 할당된 동적 메모리를 반환함.
}
이런 식으로 만들어 볼려고 하는데
#include
#include

int main() {
const int max = 400;
char line[max];
char *input[10];
FILE *in = fopen("input.txt", "r");
while (!feof(in)) {
input = fgets(line, max, in);
printf("%s", input);
}
fclose(in);
}
이렇게해서 짜보고는 있는데
뭘 추가하고 어디를 고쳐야 할까요? 부탁드립니다

김정균의 이미지

요즘 과제 시즌인가.. 과제성 질문이 많이 올라오네요

님께서 남겨 주신 pseudo code 를 대충 code 화 해 보겠습니다.

FILE * FP; fp= 파일 여는 함수("input.txt","r"); 성공적으로 파일이 열린 경우 {

파일을 여는 함수는 open, fopen 를 이용할 수 있으며, 보통은 fopen 을 사용합니다. fopen 의 man page를 보면

RETURN VALUE
Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to indicate the error.

성공시에 FILE 포인트를, 실패시에 NULL 을 반환하고 errno 에 에러를 지시하는 코드를 셋팅한다고 되어 있습니다. 그러므로.. 이 부분의 코드는 다음과 같이 작성할 수 있습니다.

#include <string.h>
#include <errno.h>
 
FILE * FP;
FP = fopen("./input.txt", "r");
if ( FP == NULL ) {
    fprintf(stderr, "Can't file open : %s\n", strerr(errno));
}

line 한줄을 가져오는 함수로는 fgets 를 이용하면 되는데, 역시 fgets man page 를 보면

char * fgets(char *s, int size, FILE *stream);

reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.

RETURN VALUE
gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read.

stream 파일 스트림에서 EOF 나 newline 까지 읽은 다음 *s 에 size 만큼 저장을 하고, 성공적으로 저장을 하면 s 의 포인트 주소를 반환한다고 되어 있습니다. 실패하면 역시 NULL 을 반환하고 errno 를 셋팅 하네요. fgets 의 반환값을 line 변수에 받으려면 s 도 역시 필요하게 됩니다. 일단 문자열을 s 에 받을 것이므로.. s 에 동적 할당을 해 줍니다.

char *s, *line;
int max = 400;
 
blah blah
 
s = malloc (max * sizeof(char));
if ( s == NULL ) {
    fprintf(stderr, "Memory allocation failed\n");
    exit (1);
}
 
while ( !feof(FP) ) {
    line = fgets (s, max, FP);
    if ( line != NULL ) { blah blah }
}

한줄을 읽어 왔으니, 다음은 input 배열에 저장을 하고, input 배열에 저장한 문자열을 출력 합니다.

i = 0;
while ( !feof(FP) ) {
    if ( i >= 10 ) {
        fprintf (stderr, "Out of range input array\n");
        break;
    }
 
    line = fgets (s, max, FP);
    if ( line != NULL ) {
        strcpy (input[i], line);
        printf ("%s\n", input[i++]);        
    }
}

loop 를 다 돌고 나면.. 이제 사용한 memory 를 반환해 줘야 합니다.

while ( !feof(FP) ) { blah blah }
 
free(s);
 
# loop 를 돌고 나면.. i 값은 라인수와 동일한 값을 가집니다.
# 배열은 0 부터 시작하니.. input 배열의 마지막 index 는 (i-1) 이 됩니다.
for ( --i; i>=0; i-- ) {
    free (input[i]);
}

P.S.
풀어 쓰느라 검증도 제대로 되지 않았으니.. 오류가 있을 수도 있습니다. 오류가 있으면 스스로 검색해서 완성해 보세요.
이 정도면 전체 코드 90% 정도는 만들어 드린것 같기는 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.