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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1143閲覧

C言語でほかのファイルのデータを読み込みたい

Nicks11

総合スコア5

C

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/13 09:10

前提・実現したいこと

C言語で他のファイルのメールアドレスを読み込み、共通するメールアドレスの一部をカウントすることを実現したいです。コマンドライン引数でファイルを指定する。

発生している問題・エラーメッセージ

コアダンプ

該当のソースコード

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

#define email_SIZE 256
#define buf_SIZE 256
#define data_SIZE 512

/* メールアドレスとその登場回数を記録
するための構造体を定義 */
struct address {
char email[email_SIZE];
int count;
};

/登録済みアドレスと一致していれば、登録済みアドレスのカウントを+1した後、0を返し
さもなくば、1を返す関数.
/
void check_new_address(int* n_address, struct address data[], char buf[]){
int i;
int is_new_address = 1; /* 登録済みのアドレスかどうかを判定するためのフラグ */

for ( i = 0; i < (*n_address); i++ ){
if ( strcmp(data[i].email, buf) == 0 ){
data[i].count++;
is_new_address = 0;
break;
}
}

if ( is_new_address ){
i = (*n_address);
strcpy(data[i].email, buf);
data[i].count = 1;
(*n_address)++;
}
}

/* バブルソートのアルゴリズムで
登場回数の大きい順に data を並べ替える関数 */
void bubble_sort(int n, struct address data[]){
int i, j;

for ( i = 0; i < n; i++ ){
for ( j = 0; j < n-i-1; j++ ){
if ( data[j].count < data[j+1].count ){
struct address tmp;
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
}
}

/出力形式を示す値を返す関数/
int out_type_num(){
int ans;

printf("\n");
printf("登場回数の多い順に出力します.\n");
printf("出力形式を選んでください\n");
do{
printf(" 0: メールアドレス,登場回数の順に出力\n");
printf(" 1: 登場回数,メールアドレスの順に出力\n");
printf(" 2: メールアドレスのみを出力\n");
printf("> ");
scanf("%d", &ans);
}
while( ans < 0 || ans > 2 );

return ans;
}

void erase_line_feed(char buf[]){
int i;

while ( buf[i] != '\n' ){
i++;
}
buf[i] = '\0'; /末尾の改行文字を\0に置き換える/
}

int main(int argc, char argv[]){
FILE
fp; /ファイルポインタ変数/
char buf[buf_SIZE]; /* データファイルから1行ずつ読み出して一時的に保存するための文字配列 /
struct address data[data_SIZE]; /
メールアドレスとその登場回数のデータ(構造体)の配列 /
int n_address; /
メールアドレスの種類数を記録 /
int i, n; /
i, j は配列の添字に使用,n はアドレスの総数を数えるために使用 /
int out_type; /
データ出力の形式を指定 */

/* データファイルをオープン */
printf("【データファイル】 %s\n", argv[1]);
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("データファイルのオープンに失敗しました\n");
exit(1);
}

n = 0;
n_address = 0;
while ( fgets(buf, buf_SIZE, fp) != NULL ){
n++;

i = 0; /*bufの末尾の改行文字を\0に書き換える関数*/ erase_line_feed(buf); /* buf に格納されたアドレスが記録済みのものと一致しているかどうか確認 */ check_new_address(&n_address, data, buf);

}

printf(" %d 件のメールアドレスを読み込みました.\n", n);
fclose(fp);
printf(" 全部で %d 種類のメールアドレスが見つかりました.\n", n_address);

/* dataをバブルソートで登場回数の多い順に並び替える */
bubble_sort(n_address, data);

/* 出力形式をユーザに問い合わせる */
out_type = out_type_num();

/* いずれかの形式で出力する */
if ( out_type == 0 ){
for ( i = 0; i < n_address; i++ ){
printf(" %s [%d 回]\n", data[i].email, data[i].count);
}
}
else if ( out_type == 1 ){
for ( i = 0; i < n_address; i++ ){
printf(" [%d 回] %s\n", data[i].count, data[i].email);
}
}
else{
for ( i = 0; i < n_address; i++ ){
printf(" %s\n", data[i].email);
}
}

return 0;
}

試したこと

ここに問題に対して試したことを記載してください。

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

別のファイル情報

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@xxx.biglobe.ne.jp

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@outlook.jp

xxx@outlook.jp

xxx@livedoor.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@outlook.jp

xxx@infoseek.jp

xxx@infoseek.jp

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@livedoor.com

xxx@infoseek.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@livedoor.com

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@outlook.jp

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@infoseek.jp

xxx@yahoo.co.jp

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@livedoor.com

xxx@outlook.jp

xxx@yahoo.co.jp

xxx@outlook.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@outlook.jp

xxx@excite.co.jp

xxx@gmail.com

xxx@outlook.jp

xxx@outlook.jp

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@infoseek.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@yahoo.co.jp

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@infoseek.jp

xxx@infoseek.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@infoseek.jp

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@yahoo.co.jp

xxx@gmail.com

xxx@yahoo.co.jp

xxx@outlook.jp

xxx@xxx.biglobe.ne.jp

xxx@gmail.com

xxx@gmail.com

xxx@gmail.com

xxx@xxx.biglobe.ne.jp

xxx@livedoor.com

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

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

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

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

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

guest

回答1

0

ベストアンサー

コアダンプ

とありますが、実際のエラーメッセージは全て載せないと原因は分からない事があります。また、デバッガ等を使えば、問題の発生個所も特定できますが、それはしてませんか?

なお、関数 void erase_line_feed(char buf[])の最初を int i = 0; (0で初期化) したら、それなりに結果が出ますが、、、? (コンパイルしたら、Warningが出た)
これが原因?


プログラムは、コードブロックに入れてください。確認が大変です。(一部の文字も消えるし、、) <code>アイコン(コードの挿入)でコードブロックが挿入されます。または、ヘルプ参照で。

投稿2020/07/13 12:12

pepperleaf

総合スコア6385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問