質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

3回答

3242閲覧

C言語 低水準入出力関数でのファイルの読み書きのコードを教えて欲しいです.

kougakaka

総合スコア25

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/10/08 11:51

前提・実現したいこと

低水準入出力関数(open関数)を使用して,『/ect/os-release』の内容を’小文字を大文字に変換’しつつ『./os-release.copied』にコピーするプログラムを作成したのですが,自分のコードが正しくできているのかわからないため,添削していただけないでしょうか.
open, close, read, writeの関数を用いて実現したいです.

OSはLinuxで,C言語を使用しています.

該当のソースコード

#include <unistd.h> // open, close, write #include <fcntl.h> // O_RDONLY, O_WRONLY, O_CREAT, O_TRUNC #include <stdio.h> // sprintf() #include<ctype.h> //toupper() #define BUF_SZ 8 int main(int argc, char *argv[]) {     int fdr, fdw, len, n;     char buf[BUF_SZ];         fdr = open("etc/os-release", O_RDONLY);     fdw = open("./os-release.copied", O_WRONLY | O_CREAT , 0666);     while ( (len = read(fdr, buf, BUF_SZ)) != 0 ){         for(n=0;n<len;n++){             buf[n] = toupper(buf[n]);         }         write(fdw, buf, len);     }     close(fdr);     close(fdw);     return 0; }

試したこと

gcc 名前.cでプログラムを動かしてみましたが,出力先(./os-release.copied)にコピーされたのかの確認方法がわからないため,コードが正しいのかわからない状況です.

補足情報(FW/ツールのバージョンなど)

OS:Linux
プログラム言語:C
Linuxのコマンドプロンプトでやっています.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2020/10/08 12:01

> 出力先(./os-release.copied)にコピーされたのかの確認方法がわからない テキストファイルなら、適当なエディタでファイルを開けば、良いのでは? 単に、 more ./os-release.copied でも良いと思いますが、、。
cateye

2020/10/08 14:32 編集

Linuxのディストリビューションによるかもですが・・・Linux mintでは。/etc/os-releaseはリンクですよ? usr ~/Project/brpredict % file /etc/os-release /etc/os-release: symbolic link to ../usr/lib/os-release usr ~/Project/brpredict % file /usr/lib/os-release /usr/lib/os-release: ASCII text ↑ふつーのテキストなので、open()使わなくても・・・・
kougakaka

2020/10/09 17:03

catでファイルを見ても、なにも表示されません(コピーがされてない?) open()を使えと言われているので、使わなければいけません。
guest

回答3

0

openの返り値をチェックして、エラーならメッセージを表示して終了するようにしましょう。
"/ect/os-release"と書くべきところを"ect/os-release"と書き誤ってるのでおそらくエラーでしょう。
それ以外は良いと思います。

厳密に言えば、writecloseも返り値をチェックすべきですが、書き込みのopenが成功していればwriteがエラーになるのはディスクフルの時くらいです。

出力先(./os-release.copied)にコピーされたのかの確認方法がわからないため,

これがちょっと信じられません。プログラムを書けるという事はエディタを使えているわけで、そのエディタでそのファイルを開けば良いだけです。
普通は、コマンドでcat os-release.copiedとします(小さいファイルの場合)。

投稿2020/10/08 12:15

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kougakaka

2020/10/09 16:50

cat は使ってたのですが、なにも表示されませんでした。(/etc/os-releaseに修正しても同じでした)
otn

2020/10/09 23:07 編集

> /etc/os-releaseに修正しても同じでした では、空と言うことでしょう。サイズを確認しましょう。 os-release.copied については、エラーで中身を書けてないので、空のままでは? これもサイズを確認しましょう。
kougakaka

2020/10/10 18:18

du -hs ./os-release.copiedでサイズを確認しましたが、0と表示されました。du -hs /etc/os-releaseでも0でした
guest

0

open("etc/os-release", O_RDONLY);

これが/etc/os-releaseへのアクセスになるのは、/をカレントディレクトリとしてこのプログラムを動かした場合に限られます。

投稿2020/10/08 12:01

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Linuxなら、Eclipseあたりでしょうか。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります
そうして、コードがどういう動作をするのか確認できます

投稿2020/10/08 11:55

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問