[질문] 파일을 읽어서 라인끝의 개행처리한 엔터키값 삭제하는 방법은?

kimyh의 이미지

아래와 같은 소스에서 두번째줄을 읽어서 두번째줄끝의 개행문자인 엔터키값을 삭제하는 방법좀 부탁드립니다.
아래에서 fscanf(member_df, "%s[^\n]\n", mid); 이부분을 어떻게 처리해야 개행문자의 버퍼값을 없애는지 알고 싶습니다.

		int pos = 2; /* 두 번째 라인을 읽습니다. */
		int i;
		FILE *member_df;
		char mid[256];		
		memset(mid, 0, 256);
 
		member_df = fopen("identification.txt", "r");
 
		for (i=0; i<pos; i++)
 
	    fgets(mid, 256, member_df);
		fscanf(member_df, "%s[^\n]\n", mid);
 
	    fclose(member_df);
	    printf(mid);

위와 같이 하니 세번째줄의 값이 나옵니다.
fscanf(member_df, "%s[^\n]\n", mid);
이 라인에서 "%s[^\n]\n" 이 부분을 어떻게 처리해야 할지를 모르겠군요.

fontutil의 이미지

  

kimyh의 이미지

제가 언급한 개행문자란 파일을 생성할때 줄을 바꾸기 위해 엔터키를 치므로써 그값이 버퍼에 저장된것을 의미한것 입니다.
제가 급하다 보니 설명이 좀 부족한것 같아 죄송하게 생각 합니다.

그런데 파일이 예를들어
"test.txt"
aaaaaaaaaaaa
bbbb
This is a book
ccccccc
ddddddddddd

라고 할경우 각 라인의 문자가 스페이스가 없다면 알려주신대로 하면 잘 됩니다.
그런데 세번째 라인처럼 중간에 스페이스가 있는경우에는 스페이스 전까지만 읽고 라인 전체를 읽지 못합니다.
아무래도 제가 fscanf(member_df, "%s[^\n]\n", mid); 이부분을 이해를 못한것 같군요.
제가 원하는건 특정라인의 문장사이에 스페이스가 있든 없든 라인전체를 라인 맨뒤의 엔터키값 없이 읽고자 한것 입니다.
man fscanf 페이지를 봐도 영어가 짧아서 이해하기가 여간 어렵지가 않아서요.(죄송...)
아시는분 계시면 도움좀 주시면 감사하겠습니다.

=========================================
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

절차탁마의 이미지

#include <stdio.h>
#include <string.h>
 
int main(void)
{
    FILE *f;
    char *p;
    char buf[256];
 
    f = fopen("abc.txt", "r");
    if (f == NULL)
        return -1;
 
    while (fgets(buf, 256, f)) {
        p = strchr(buf, '\r');
        if (p)
            *p = 0;
 
        p = strchr(buf, '\n');
        if (p)
            *p = 0;
        printf("%s\n", buf);
    }
 
    fclose(f);
 
    return 0;
}
익명사용자의 이미지

그냥 라인 읽어서 엔터키 삭제하는 부분이라면 저는

fgets(temp, 256, fp);
char* p;
if((p = strchr(temp, '\n'))!= NULL) *p = '\0';

그냥 이런식으로 처리하는데요

이걸 말씀하시는게 아닌거 같지만 혹시 해서 적어봅니다. ^^

kimyh의 이미지

답변 주신분들 정말 감사합니다.
어제 밤 꼬박 새웠습니다.
답변 주신대로 모두 해보니 잘 됩니다.
또 아래와 같은 방법도 잘 되더군요.

int poss = 2; /* 2 번째 라인(이름)을 읽습니다. */
int i;
member_df = fopen(path01, "r");
for (i=0; i<poss; i++)
fgets(name, 35, member_df);
fscanf(member_df, "[%s]", name);
char *point, namea[35];
strcpy(namea, name);
point = strdup(namea);
char *pointer;
pointer = (char *)strtok(point,"\n");	    
fclose(member_df);

strtok() 함수를 함께 사용해도 해결되더군요.

다시한번 답변 해주신분들께 진심으로 감사드립니다.
열심히 공부 하겠습니다.

====================================
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.

jemiro의 이미지

위코드에서는 메모리릭이 발생합니다.
strdup 사용시는 꼭 free를 해주어야 합니다.
free를 쓰지 않으려면 strdupa 를 사용해야 합니다.
간단한 실수가 큰 버그를 만들죠.

harisoo의 이미지

그리고 앞에 %s는 왜 붙은거죠?

fscanf(member_df, "%s[^\n]\n", mid);

가 아니고 이게 맞는거 같은데..
fscanf(member_df, "%[^\n]", mid);
jemiro의 이미지

심심해서 고쳐봤는데,
댓글 달려고 보니, harisoo님이 정확한 지적을 하셨네요.

#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
int main()
{
    char mid[256];
    FILE *member_df = fopen("identification.txt", "r");
    if (member_df) {
        const int pos = 2;
        for (int i = 0; i < pos; i++) {
            memset(mid, 0, sizeof(mid));
            if (fscanf(member_df, "%[^\n]\n", mid) != 1)
                break;
        }
        fclose(member_df);
        printf(mid);
    }
    return 0;
}
익명 사용자의 이미지

fgets로 한 라인씩 읽고,

문자열의 마지막이 개행문자인지 검사해서 개행문자면 대신 eos를 넣으면 될 문제입니다.

while (fgets(buf, 256, f)) {

int len = strlen(buf);
if(D) printf("%s name len is %d\n", buf, len);
while(buf[len-1] == '\n' || buf[len-1] == '\r')
{
buf[len-1] = '\0';
len = strlen(buf);
}
}

댓글 달기

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