←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3815

C言語 コマンドライン引数
投稿者---C初心者小僧(2005/05/27 23:45:15)


コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-2までの内容を連結し、その結果得られたテキストに出現するアルファベット小文字をすべて対応する大文字に変換したものをファイルn-1に書き込み、連結して得られたテキストの空行を取り除いたものをファイルnに書き込むプログラムを書け。 ただし、入力ファイルに関してエラーが発生した場合、そこで処理を終了せず、残りのファイルの処理を続けること。
なんですがここまでしかわかりません。
めちゃくちゃなプログラムですがどなたかアドバイスを。。。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<ctype.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)

void copy_file(const char *, const char *);
void dataChangeSize()//この括弧の中身
void dataSpaceCut()//この括弧の中身

void dataChangeSize(char buf[1024], char *p, ssize_t len, ssize_t len1)
{
int i;

while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
p = buf;
for(i=0;i<len-1;i++){
buf[i] = toupper(buf[i]);
}
while ((len1 = write(STDOUT_FILENO, p, len)) >= 0 && len > len1) {
len -= len1;
p += len1;
}
if (len1 == -1) {
exit(1);
}
}
if (len == -1) {
exit(1);
}
return 0;
}


void dataSpaceCut(char buf[1024], char *p, ssize_t len, ssize_t len1, ssize_t len2)
{
int i;

while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
p = buf;
len2 = len;
for(i=0;i<len2-1;i++){
if(buf[i] == ' '){
len2 -= 1;
j = ++i;
while(len2-1 >= j){
buf[j-1] = buf[j];
j++;
}
buf[j-1] = '\0';
}
}
while ((len1 = write(STDOUT_FILENO, p, len)) >= 0 && len > len1) {
len -= len1;
p += len1;
}
if (len1 == -1) {
exit(1);
}
}
if (len == -1) {
exit(1);
}
return 0;
}

void copy_file(const char *path_in, const char *path_out)
{
int fd_in, fd_out;
char buf[1024], *p;
ssize_t len, len1;

fd_in = open(path_in, O_RDONLY);
if (fd_in == -1) {
perror(path_in);
exit(1);
}
fd_out = open(path_out, O_WRONLY | O_CREAT | O_TRUNC, FILE_MODE);
if (fd_out == -1) {
perror(path_out);
exit(1);
}
while ((len = read(fd_in, buf, sizeof(buf))) > 0) {
p = buf;
while ((len1 = write(fd_out, p, len)) >= 0 && len > len1) {
len -= len1;
p += len1;
}
if (len1 == -1) {
perror(path_out);
exit(1);
}
}
if (len == -1) {
perror(path_in);
exit(1);
}
close(fd_out);
close(fd_in);
}

int
main(int argc, char *argv[])//mainもコピーにしか対応してません。。
{
if (argc != 3) {
return 1;
}
copy_file(argv[1], argv[2]);
return 0;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C言語 コマンドライン引数 3820 RAPT 2005/05/28 00:41:28
<子記事> Re:C言語 コマンドライン引数 3830 shu 2005/05/28 15:00:37


No.3820

Re:C言語 コマンドライン引数
投稿者---RAPT(2005/05/28 00:41:28)


で、開発環境は? アクセスグループがあるって事はUNIX系かな。
それからソースコードはHTML変換ツールで字下げされてないので
読む気になれず。

で、何について質問したいのでしょう?
何ができていて何のどこがどのように分からないのでしょうか。
漠然と「ここまでしか分かりません」とか言われても
「どこまで」理解できているのかすら伝わりません。

# がつっと手抜きするならsystem()関数で終わりっつー手もあるけど。



この投稿にコメントする

削除パスワード

No.3823

Re:C言語 コマンドライン引数
投稿者---C初心者小僧(2005/05/28 02:51:25)


返信ありがとうございます。
ほんとに初心者なのでよくわからないのですが、VINE LINUXつかってます。
system関数をしらべてもう一度考えたいと思います。
ありがとうございます。


この投稿にコメントする

削除パスワード

No.3824

Re:C言語 コマンドライン引数
投稿者---RAPT(2005/05/28 10:28:34)


ってことはコンパイラはgccでしょうか。

それから、課題であれば、system()で解決する事は
C言語を使った事にならないので、だめでしょう、きっと。
# 要はシェル(bash/csh)と一緒になるから。




この投稿にコメントする

削除パスワード

No.3830

Re:C言語 コマンドライン引数
投稿者---shu(2005/05/28 15:00:37)


参考になるかもしれないプログラムを三つほど

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/*** プログラム1 ***/
int main( int argc, char *argv[] )
{
    char buf[BUFSIZ] = {0};
    FILE *fp = NULL;
    int i;
    
    for (i = 1; i < argc; i++)
    {
        if (!(fp = fopen( argv[i], "r" )))
            continue;
        
        while (fgets( buf, BUFSIZ, fp ))
            fputs( buf, stdout );
            
        fclese( fp );
    }
    
    return 0;
}
/*** プログラム2 ***/
int main( int argc, char *argv[] )
{
    char buf[BUFSIZ] = {0};
    FILE *fp = NULL;
    
    if (!(fp = fopen( argv[1], "r" )))
        exit(1);
    
    while (fgets( buf, BUFSIZ, fp ))
        fputs( buf_toupper( buf ), stdout );
        
    fclese( fp );
    
    return 0;
}
char *buf_toupper( char buf[] )
{
    int i;
    
    for (i = 0; buf[i]; i++)
        buf[i] = toupper( buf[i] );
        
    return buf;
}
/*** プログラム3 ***/
int main( int argc, char *argv[] )
{
    char buf[BUFSIZ] = {0};
    FILE *fp = NULL;
    
    if (!(fp = fopen( argv[1], "r" )))
        exit(1);
    
    while (fgets( buf, BUFSIZ, fp ))
        if (buf[0] != '\n')
            fputs( buf, stdout );
        
    fclese( fp );
    
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity