🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

1432閲覧

文字列を2進数に変換してファイル出力したい

tyapapa

総合スコア51

C

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2021/02/09 13:45

編集2021/02/09 23:45

以下のfiledata[8]に格納してある文字列を2進数に変換して出力したいです。
条件として、1バイト区切りにカンマを格納したい。

イメージとしては、以下の様に出力したい
↓ファイル.txtの中身(左からABCDEF)
/////////////////////////////////////////////////////////////////////
01000001,01000010,01000011,01000100,01000101,01000110, 01000111
/////////////////////////////////////////////////////////////////////

C

1int main() 2{ 3 FILE *pFile; // ビット出力用ファイルポインタ 4 char filedata[8] = { "ABCDEFG" }; // 終端はNULL 5 char str[71]; // ビット格納用配列 8*8ビット+1バイト区切りで【,】を格納 6 int rcount = 71; // 8バイトカウント 7 // 出力用配列初期化 8 memset( str, 0x00, sizeof( str ) ); 9 // ファイルオープン 10 pFile = fopen( "./bitFile.txt", "w" ); 11 12 for ( int count = 0; count < 8; count++ ) 13 { 14 int beforeBit = filedata[count] - '0'; // 該当番地の文字を数値として抜き出す 15 int bit = 1; // マスクビット 16 int bitcount = 8; // 8ビットカウント 17 while (1) 18 { 19 // 対象が0の場合は確認完了 20 if (( beforeBit == 0 ) && ( bitcount <= 0 ) ) 21 { 22 break; 23 } 24 // 該当ビットを抜き出す。 25 str[rcount] = beforeBit & bit; 26 // 次のビットへ移動 27 beforeBit = beforeBit >> 1; 28 rcount--; 29 bitcount--; 30 } 31 // 8バイト区切り文字を格納 32 str[rcount] = ','; 33 rcount--; 34 } 35 36 // ファイル出力 37 fprintf( pFile, "%s\n", str ); 38}

上記処理の場合、
fprintf( pFile, "%s\n", &str );を実行後に
↓の様な例外が発生してしまいます。
Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted.
strの領域問題と考えstr[256]の様に大きめに確保しても同様のエラーが出ております。
どうしたら正常にファイル出力が行えるでしょうか?
また、もっと簡単に文字列→2進数に変換してファイルへ出力する方法がございましたら教えていただきたいです。

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

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

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

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

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

kazuma-s

2021/02/09 14:26

'F' が 00001111 なら 'G' は 00010000 ですか?
tyapapa

2021/02/09 23:47

質問の内容を変更しておりますが、 ASCIIコードに従って出力したいのでG(10進数の71)の場合は、1000111になります
guest

回答3

0

ベストアンサー

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char filedata[8] = "ABCDEFG"; 6 char str[72] = ""; 7 int k = 0; 8 for (int i = 0; i < 8 && filedata[i]; i++) { 9 for (int j = 8; --j >= 0; ) str[k++] = filedata[i] >> j & 1 | '0'; 10 str[k++] = ','; 11 } 12 str[k-1] = '\0'; 13 FILE *fp = fopen("./bitFile.txt", "w"); 14 if (!fp) return 1; 15 fprintf(fp, "%s\n", str); 16 fclose(fp); 17}

参考になりますか?
理解できますか?

投稿2021/02/09 23:50

kazuma-s

総合スコア8224

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

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

tyapapa

2021/02/13 04:15

理解できました。ソース作り直しありがとうございます!
guest

0

間違いが多くて修正が困難です。例を置いていきます。

c

1#define N 6 2int main() 3{ 4 char filedata[N+1] = "ABCDEF"; 5 for (int i=0; i<N; i++) { 6 int num = filedata[i]-'A'+10; 7 for (int j=0; j<8; j++) { 8 printf("%d", (num>>(8-j-1))%2); 9 } 10 if (i+1 < N) { 11 printf(","); 12 } 13 } 14}

投稿2021/02/09 15:04

hagi3to5

総合スコア23

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

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

0

文字列、というのは終端に’¥0’をおいた文字配列です
str はそうなってませんね.

って、そもそもstrには文字データがはいってませんね。
’0’の文字ってのはどういうデータかわかるでしょうか

投稿2021/02/09 14:22

編集2021/02/09 14:29
y_waiwai

総合スコア88038

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

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

tyapapa

2021/02/09 22:47

’0’は文字の10進数でいうところの48にあたる認識です 文字 - '0'で数字に変換してしまっているのでstrには文字が入っていないって意味ですかね。 そして、終端が分かるようにするためにも、str[71] = '\0'も必要になるってことですか
y_waiwai

2021/02/09 23:53

// 該当ビットを抜き出す。 str[rcount] = beforeBit & bit; その10進数の48は入ってませんね strには、48と49,最後の0、しか入ってはいけません、が、そうなってはいません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問