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

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

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

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

ファイル

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

プログラミング言語

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

Q&A

解決済

2回答

6248閲覧

ファイルを読み込み、ソートして別ファイルに出力するプログラムで、出力ファイル名の末尾に読み込んだファイル名が追記されている

kopikopio

総合スコア1

C

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

ファイル

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

プログラミング言語

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

0グッド

0クリップ

投稿2020/09/25 13:52

前提・実現したいこと

勉強のためにC言語でプログラミングしております。

7桁の数字が10000000件入っているテキストファイルを読み込み、
ソートして別ファイルに出力するプログラムを作っておりますが、
出力ファイル名の末尾に、読み込んだファイル名も追記されています。

原因、解決策を教えていただきたいです。

入力テキストファイル作成プログラムと、
ソートして別ファイルに出力するプログラムを添付します。

そのままコンパイルして実行できると思います。

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

出力ファイル名が「sort1.txtinputData.txt」となる 出力ファイル名を「sort1.txt」としたい

該当のソースコード

c

1/* 入力テキストファイル作成プログラム*/ 2#include <stdio.h> 3#include <time.h> 4#include <stdlib.h> 5 6int main() { 7 // ファイル作成 8 FILE *fp; 9 char fileName[13] = "inputData.txt"; 10 fp = fopen(fileName , "w"); 11 if (fp == NULL) { 12 printf("ファイルが開けませんでした"); 13 exit (1); 14 } 15 // データ書き込み 16 srand((unsigned)time(NULL)); 17 for(int i = 0; i < 10000000; i++) { 18 fprintf(fp,"%07d\n", (rand() % 10000000)); 19 } 20 21 // ファイルクローズ 22 fclose(fp); 23 return 0; 24}

c

1/* 入力テキストファイルソート、ファイル出力プログラム*/ 2#include <stdio.h> 3#include <time.h> 4#include <stdlib.h> 5 6/* ソート関数 */ 7int sort( const void * a , const void * b ) { 8 9 if( *( int * )a < *( int * )b ) { 10 return -1; 11 } 12 else if( *( int * )a == *( int * )b ) { 13 return 0; 14 } 15 return 1; 16} 17 18int main() { 19 20 int *inputData = (int *)malloc(4 * 10000000); 21 if (inputData == 0) { 22 fprintf(stderr, "メモリ確保エラー\n"); 23 exit(1); 24 } 25 26 // ファイル読み込み 27 FILE *inputFp; 28 char inputFileName[13] = "inputData.txt"; 29 inputFp = fopen(inputFileName , "r"); 30 if (inputFp == NULL) { 31 printf("ファイルが開けませんでした"); 32 exit (1); 33 } 34 // データ読み込み 35 for(int i=0; i<10000000; i++){ 36 fscanf(inputFp, "%d", &(inputData[i]) ); /* 1行読む */ 37 } 38 // 読み込みファイルクローズ 39 fclose(inputFp); 40 41 // データソート 42 qsort(inputData, 10000000, sizeof(int), sort); 43 44 // 書き込みファイル作成 45 FILE *outputFp; 46 char outputFileName[9] = "sort1.txt"; 47 48 // sort1.txtinputData.txtと表示される 49 printf("%s\n", outputFileName); 50 51 outputFp = fopen(outputFileName , "w"); 52 if (outputFp == NULL) { 53 printf("ファイルが開けませんでした"); 54 exit (1); 55 } 56 // データ書き込み 57 for(int i = 0; i < 10000000; i++) { 58 fprintf(outputFp,"%07d\n", inputData[i]); 59 } 60 // 書き込みファイルクローズ 61 fclose(outputFp); 62 return 0; 63 free(inputData); 64}

試したこと

googleで検索しましたが、わかりませんでした。

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

Linux
vscode
gccコンパイル

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

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

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

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

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

guest

回答2

0

ベストアンサー

配列サイズが足りていません(文字列末尾にはNULL文字が付きます)

c

1 char inputFileName[14] = "inputData.txt"; 2 3 char outputFileName[10] = "sort1.txt";

要素数を省略し以下のように書くこともできます。

c

1 char inputFileName[] = "inputData.txt"; 2 3 char outputFileName[] = "sort1.txt";

もしくは

c

1 const char* inputFileName = "inputData.txt"; 2 3 const char* outputFileName = "sort1.txt";

投稿2020/09/25 14:13

編集2020/09/25 15:05
SHOMI

総合スコア4079

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

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

kopikopio

2020/09/26 05:54

ご回答ありがとうございます。 複数の修正方法を提示いただきありがとうございます。 ご指摘頂いた内容で修正したら、正しい結果となりました。 どうもありがとうございました。 (自分が見た時点で一番高評価が高かったため、ベストアンサーとさせていただきます。)
guest

0

C言語においての文字列ってのは、後端に'\0'をくっつけた文字配列です。
なので、配列のサイズは、文字列文字数+1が必要です。

char inputFileName[13] = "inputData.txt";

この宣言では、後端'\0'が入らないので、文字列終端が判別できないため、たまたまメモリに入ってるデータを'\0'に出会うまで文字列としてしまいます

#修正法は別回答を参照

投稿2020/09/25 22:28

編集2020/09/25 22:29
y_waiwai

総合スコア87747

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

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

kopikopio

2020/09/26 05:56

ご回答ありがとうございます。 原因について、ご丁寧にご説明いただきありがとうございます。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問