리눅스 시스템호출 open함수가 파일 내용을 인식하지 못하는 것 같습니다.

minah741의 이미지

명령줄 인수에서 파일 이름을 받고 파일 디스크립터를 통해서 파일을 열었는데요, 파일 자체는 인식을 하나 내용을 인식을 못하네요. 파일 내용을 출력해보려고 하니 null문자만 뜨는데 open함수에 문제가 있는걸까요?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAXLINE 512
 
int main(int argc, char *argv[]){
 
	int line = 0;
	int nchars = 0;
	int lineStart[MAXLINE] = {0};
	int fd;
	ssize_t nread;
	char c;
	int i;
	char buf[MAXLINE];
 
	fd = open(argv[1], O_RDONLY, 0640);
 
	if(fd==-1){
		perror(argv[1]);
		exit(1);
	}
 
	fprintf(stdout,"%s", argv[1]);
	printf("%s\n", buf[nchars]);
 
	while((nread = read(fd, buf, 1))>0){
	nchars++;
	printf("%s", buf[nchars]);
		if(buf[nchars] == '\n'){
			line++;
			lineStart[line] = nchars;
		}
	}
 
	printf("-------------\n");
	for(i=0; i<=line; i++){
		printf("%d: %d\n", i, lineStart[i]);
	}
	printf("-------------\n");
 
	for(i=line; i>0; i--){
		lseek(fd, (long)(lineStart[i-1]), SEEK_SET);
		read(fd, buf, lineStart[i]-lineStart[i-1]);
		write(fd, buf, lineStart[i]-lineStart[i-1]);
	}
	close(fd);
	exit(0);
} 
File attachments: 
첨부파일 크기
Image icon 스크린샷, 2017-03-24 17:29:07.png8.34 KB
 의 이미지

while((nread = read(fd, buf, 1))>0){ // 어디로 읽어들이고
	nchars++;
	printf("%s", buf[nchars]); // 무엇을 출력하고 있나요?
		if(buf[nchars] == '\n'){
			line++;
			lineStart[line] = nchars;
		}
}
minah741의 이미지

fd를 buf로 읽어들이고 buf를 한글자씩 출력하려고 했습니다ㅜㅜ

익명 사용자의 이미지

그래서 문제를 파악하셨다는 것인지요? 앞 댓글을 읽고도 문제를 파악하지 못했는데 어쨌거나 minah741 님이 의도했던 바는 그랬다는 것인지요? 게시판은 대화하듯이 소통할 수 있는 공간이 아닙니다. 글을 가능한 한 분명하게 또 간결하게 쓰셔야지요.

질문도 성의가 없네요. 문제가 되는 부분만 골라내서 간결한 코드를 올리셔야 좋은 답변을 얻기가 쉽겠지요. 읽는 사람들이 에너지를 덜 쓰고 대답할 수 있으니까요. 예의이기도 하구요. 또 그 과정에서 문제가 해결될 수도 있구요.

buf에 어떤 내용이 들어있는지 확인은 해보셨는지요? 안해보셨을 거라고 추측합니다 :) 최소한 buf 내용을 루프 안에서 매번 화면에 출력해보기만 했어도 쉽게 파악되었을 문제입니다. 그냥 끙끙거리면서 코드를 쳐다봐도 아무것도 해결되지 않습니다. 이렇게 저렇게 변화를 줘보면서 실험도 해보고, 힌트를 얻기 위해 이것 저것 정보를 얻어봐야지요. 모르겠는 것을 질문하는 것은 매우 좋은 일입니다만 일단 손발을 움직여 고생하면서 문제를 스스로 파악하고 나서 질문해야 실력이 늡니다.

꼰대 소리 좀 했습니다. 그리고 저는 위에 친절하게 답변달아주신 분과 다른 사람입니다. 오해하지 마십시오.

minah741의 이미지

아닙니다 쓴소리 감사합니다 혼자 고민해보다가 어찌해야할지 몰라서 글을 올렸는데 오늘 처음 가입하다보니 게시판의 룰이나 분위기를 잘 몰랐던 것 같습니다 이것저것 실험해보고 함수 정의도 쭉 살펴봤는데 잘 모르겠어서 글을 올리다보니 성의없어 보였던 점도 죄송합니다 소통하듯이 대화하는 공간은 아니지만 불편함을 느끼심에 대해 사과드리고 다시 공부해보러 가겠습니다 죄송합니다

 의 이미지

그렇게까지 사과하실 일은 아닙니다만

1. 제 답변을 조금 오해하신 것 같군요.

저는 질문자님이 무슨 의도로 코딩했는지를 여쭈어 본 게 아니라, 지금 올리신 코드가 어떻게 동작하고 있는지 다시 확인해보시라는 의도로 말씀드린 겁니다.

질문자님이 지금 어느 정도 수준인지 제가 가늠하기가 어려우니, 혹시 잠깐 실수하시고 미처 확인하지 못하신 거라면 제가 그냥 짚어드리는 정도로 해결할 수 있을 줄 알았지요.

만약 자세히 살펴보시고도 어디가 문제인지 스스로 판단하시기 어렵다면, 유감스럽게도 질문자님은 지금 syscall을 포함하는 프로그래밍을 하실 때가 아닌 것으로 보입니다.

물론 꼭 하셔야겠다면야 말릴 이유는 없겠습니다만, 자기가 짠 코드가 어떻게 동작하는지 스스로 파악하는 능력은 프로그래머의 기초소양입니다. 좀 더 쉬운 프로그램을 짜면서 수양하시는 편이 장기적으로 질문자님께 더 좋으리라고 생각이 됩니다.

2. kldp 게시판의 룰이나 분위기하고는 조금 다른 문제입니다.

어느 사이트의 어느 질답란이든 1) 질문글이 길고 복잡하며 2) 질문자의 현재 수준을 가늠할 근거가 없어서 설명을 어디서부터 시작해야 할지 모르겠을 경우 답변자에게 별로 달갑지 않습니다. 답변을 다는 데 상상한 수고가 들어갈 뿐더러 실질적으로 도움이 안 될 가능성이 있어서 말이죠. 특히나 3) "내 코드 디버그 해주세요" 같은 질문글은 또 굉장히 사적인 질문이라 답변을 달아놓더라도 질문자 한 사람한테만 이득인 경우가 많죠. 아주 반면교사적인 케이스가 아닌 이상 제3자가 거기서 뭘 배워갈 수 있겠습니까. 말인즉슨 답변 다는 보람도 별로 없다는 얘깁니다.

웬만하면 이런 달갑지 않은 경우엔 전 그냥 답변 안 달고 넘어갑니다. 이 질문글의 경우처럼 한눈에 봤을 때 문제 파악이 되면 이왕 파악한 김에 뭐라도 써 놓기는 합니다만, 아무튼 특별히 무슨 성의를 갖춰야 한다던가 하실 필요는 없더라도 답변을 바라시면 답변이 달리기 쉬운 형태로 질문글을 올리시는 편이 좋겠지요.

댓글 달기

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