c언어,자료구조 공부하는 학생인데 질문드립니다.

is1472의 이미지

제가 현재 파일을 읽어와서 출력하는 알고리즘을 짜고있습니다. 간단하게 설명드리자면
text파일에
abc qwe
def tyu
라고 적혀있으면 이를 구조체에 담아서 링크드리스트하는 과정입니다.
이를 fscanf로 읽어와서 출력하는것인데
문제가생깁니다
만약 tyu 다음에 개행문자\n 이 파일에 써이는 상태면 feof함수가 eof를 못읽어서 fscan함수가 한번 돌아서 나중에 출력 될때 쓰레기값이 같이 출력됩니다..
그래서 파일을 끝까지 읽었을 때 파일의 개행문자를 지워주는 함수를 생각중인데 도저히 되질 않아서 질문드립니다.

물론 지우는 방식이아니라 다른방식으로 해결은 했습니다
fprintf(""); 이런식으로 사용하고 더입력받을 때만 if문으로 ("\n"); 을 추가하는 형식으로요
즉 더이상 받지않으면 txt파일 마지막 문장에는 \n 써있지 않은거죠
근데 이 방식이아니라 fprintf(p,"%s %s\n",a,b); 이런 식으로 파일에 쓰고 나중에 읽어올 때 끝 개행문자만 지우는 식으로 해서 정상적인 작동을 하게 해보고싶습니다. 어떻게해야 될까요?

 의 이미지

입력을 어떤 식으로 받는지 모르겠지만...

fscanf(file, "%s", /* something */)와 같이 받고 있다면, fscanf의 반환값을 체크하시기 바랍니다.
*scanf류 함수들은 실제로 입력을 받는 데 성공한 인수의 숫자를 반환합니다. 즉 위의 예에서는 1을 반환하지 않았다면 입력을 받지 못한 것입니다.

fscanf(file, "%s %s", /* something */)라면 반환값이 2여야겠죠.

자세한 내용은 레퍼런스를 참조하세요: http://en.cppreference.com/w/c/io/fscanf

is1472의 이미지

fprintf(p, "%d %s %s %s %s %s %s %s %s %s\n", *k, std->Name.fst, std->Name.sec, m, std->ptr.site[0],std->ptr.site[1], std->ptr.site[2], std->ptr.site[3], std->ptr.site[4], std->phon);

이런식으로 반복문으로 파일에 옯겨 줍니다 여기서 끝부분 \n 보이시죠.
그리고 이를 나중에 다른 함수 가져와서
int i = 0;
stdNode *newNode = (stdNode *)calloc(sizeof(stdNode), 1); // 새로운 노드
for (i = 0;i<5;i++) {
newNode->ptr.site[i] = (char *)malloc(sizeof(char) * 50);
}
newNode->phon = (char*)malloc(sizeof(char) * 20);
fscanf(p, "%s %s %s %d %s %s %s %s %s %s", newNode->num, newNode->Name.fst, newNode->Name.sec,
&(newNode->stdNum), newNode->ptr.site[0], newNode->ptr.site[1], newNode->ptr.site[2]
, newNode->ptr.site[3], newNode->ptr.site[4], newNode->phon);

newNode->prev = plist->tail->prev;
plist->tail->prev->next = newNode;

newNode->next = plist->tail;
plist->tail->prev = newNode;

(plist->numOfStd)++;
return newNode;
이렇게 가져온다음에

if (plist->numOfStd == 1)
plist->cur = plist->head->next;
else
plist->cur = plist->cur->next;
printf("%s %s %s %d %s %s %s %s %s %s\n", plist->cur->num, plist->cur->Name.fst, plist->cur->Name.sec
, plist->cur->stdNum, plist->cur->ptr.site[0], plist->cur->ptr.site[1], plist->cur->ptr.site[2],
plist->cur->ptr.site[3], plist->cur->ptr.site[4], plist->cur->phon);

출력합니다

문제는 아까 가져오는과정에서 \n 이것 떄문에 가져오는 함수가한번더 진행되요
while (1) {
if(feof(p)!=0)
break;

lInsert(p, &list); //파일에 들어있는 내용 저장
listPrint(&list);
}
feof가 인식을못해요..

라스코니의 이미지

fscanf()로 바로 읽지 마시고

fread(buf) 또는 fgets(buf), sscanf(buf, "%d") 식으로 읽어보시기 바랍니다.

때로 scanf() 함수들은 프로그래머가 기대한 만큼 결과를 돌려주지 않을 때가 자주 있습니다.

is1472의 이미지

읽어서 구조체에다 저장을 시켜야해서 fread나 fgets는 쓸수가 없구요..sscanf 는 처음보는데 설명좀해주실수있나요?

라스코니의 이미지

fread()/fgets()를 써서 우선 파일 한 라인 라인을 버퍼에다 옮기고 sscanf()를 써서 변수(구조체)에 넣으시면 됩니다.

sscanf()는 scanf(), fscanf()와 사용법이 동일합니다. 단지 버퍼로부터 읽는 다는 점이 다릅니다.
이것이 장점인데 예를 들어 프로그래머가 sscanf() 를 호출하기 전에 버퍼를 조작할 수 있습니다. \n 을 날린다던지 읽기 쉽도록 , : ; 를 넣을수도 뺄수도 있고요.

더 자세한 사용법은 구글링해보시면 됩니다.

is1472의 이미지

공부 해보겠습니다!

댓글 달기

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