write 함수에서의 개행

cacus의 이미지

write 시스템 콜을 구현해보고 있습니다.

명령 인수를 전달 받아서 파일에 쓰는것을 연습하고 있는데요.

int main(int argc, char *argv[])

fd = open("data.txt", O_WRONLY | O_APPEND | O_CREAT , 0644);

write(fd, argv[1], strlen(argv[1]));

argv[1] 의 문자열을 파일에 쓰려는데 잘 안되네요.
파일에 쓰여진다 하더라도 개행이 안되는데 고수님들께 조언 부탁드리겠습니다.

fopen, fwrite, fget 로는 구현해 봤구요, 저수준의 파일입출력으로만 하려고 합니다.

write 는 주로 소켓프로그램을 짤때 사용하는건가요??

체스맨의 이미지

줄바꿈을 하려면, 개행 문자 '\n' 를 출력해주시면 됩니다.
좀 더 나아가 각 플렛폼마다 행바꿈할 때 사용하는 문자에 차이가 있기 때문에, 그런 부분도 생각하셔야 겠지요.

Orion Project : http://orionids.org

cacus의 이미지

개행 문자를 출력하려고 하는게 아니구요. 개행 문자까지 포함해서 파일에 쓰려고 하는것입니다.
예를 들어 1쓰고 2쓰고 3쓰고 파일을 열어보면 123 이렇게 적혀있겠죠. 이것을 개행해서
1
2
3
이렇게 파일에 쓰려고 하는것입니다.

배열을 이용하면 파일의 마지막에 '\0' 을 포함하는것으로 알고 있는데 '\n' 까지 포함하는 방법은 없을까요?

체스맨의 이미지

특별한 경우가 아닌 이상 argv 에는 개행문자가 붙어들어오지 않습니다.
결국 두번 쓰기를 해야한다는 얘기죠.

char lf;
write(fd, argv[1], strlen(argv[1]));
lf = '\n';
write(fd,&lf,1);

도스나 맥오에스 개행 문자까지 생각한다면, 좀 더 뭔가 해야겠죠.

표준 입출력 함수들은 자체적으로 입출력 버퍼를 가지고 있어서, 버퍼가 꽉 찼을 때 쓰기 작업을 행하기 때문에, 위와 같은 경우에도, 실제 쓰기 작업은 두번에 걸쳐서 일어나지 않겠죠. 그런 것까지 구현하시려면, 버퍼 관리까지 직접 해야 되구요.

말씀하신 것처럼 개행 문자를 붙인다는 생각으로 하려면, 다른 버퍼에 복사해놓고, 개행문자를 붙여준다음에 쓰기를 해야겠죠.

char buf[256];
int len = strlen(argv[1]);
assert( len<=sizeof(buf)-1 );
memcpy( buf, argv[1], len );
buf[len++] = '\n';
write( fd, buf, len );

Orion Project : http://orionids.org

ktd2004의 이미지

이러면 되지 않나요?(직접 실행해보진 않았습니다...)

len = strlen( argv[1]);
for( i=0; i<len; i++) {
    write( fd, &argv[1][i], 1);
    write( fd, "\n", 1);
}

댓글 달기

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