いつもお世話になっております。
テキストファイルの内容を10進数の数値で表示させたいと考えております。
①(terminal上に記載)で、ファイルから読み取った文字を数値に変換し、
その数値が入った変数をfwrite関数で標準出力に出力しているつもりです。
ですが、今出力されるのは、元々そのファイルに記載されている文字情報だけです。(②)
どうしてこうなってしまうのか分かりません。
ご教授いただけませんでしょうか。
よろしくお願いいたします。
C
1 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6 7#define ARGUMENT_MUM 2 8#define SIZE 254 9#define TRUE 1 10 11int main(int argc, char** argv) 12{ 13 FILE *fp = NULL; 14 char fromFile[SIZE] = {0}; 15 char fileContents[SIZE] = {0}; 16 int iFileContent = 0; 17 int iRet = 0; 18 19 20 if (argc != ARGUMENT_MUM){ 21 printf("コマンドライン引数エラー\n"); 22 return -1; 23 } 24 strncpy(fromFile, argv[1], sizeof(fromFile)); 25 fp = fopen(fromFile, "rb"); 26 if (fp == NULL){ 27 printf("fopen失敗\n"); 28 return -1; 29 } 30 31 while(TRUE){ 32 iFileContent = 0; 33 // ファイルの読み込み 34 iRet = fread(fileContents, sizeof(char), 1, fp ); // 1バイトずつ読んでいって、 35 if (iRet < 1){ // 読み取れなくなったら 36 if (feof(fp)){ // ファイルの終端の場合 37 break; 38 }else{ // それ以外 39 printf("fread読み込み失敗\n"); 40 break; 41 } 42 } 43 // 標準出力への出力 44 iFileContent = (unsigned char) fileContents[0]; // 文字を対応する数値に変換 // その数値を標準出力に出力 45 iRet = fwrite(&iFileContent, sizeof(iFileContent), 1, stdout); 46 if (iRet < 1){ // 書き込めなかったら 47 printf("fwrite書き込み失敗\n"); 48 break; 49 } 50 } 51 52 iRet = fclose(fp); 53 if (iRet != 0){ 54 printf("fcloseエラー"); 55 return -1; 56 } 57 58 return 0; 59}
gdb
1Thread 2 hit Breakpoint 1, main (argc=2, argv=0x7ffeefbff6d8) at 問題10.c:28 228 iRet = fread(fileContents, sizeof(char), 1, fp ); // 1バイトずつ読んでいって、 3(gdb) n 429 if (iRet < 1){ // 読み取れなくなったら 5(gdb) p fileContents 6$1 = "a", '\000' <repeats 252 times> 7(gdb) n 8 9Thread 2 hit Breakpoint 2, main (argc=2, argv=0x7ffeefbff6d8) at 問題10.c:38 1038 iFileContent = (unsigned char) fileContents[0]; // 文字を対応する数値に変換 11(gdb) n 12 13Thread 2 hit Breakpoint 3, main (argc=2, argv=0x7ffeefbff6d8) at 問題10.c:40 1440 iRet = fwrite(&iFileContent, sizeof(iFileContent), 1, stdout); 15(gdb) p iFileContent 16$2 = 97 // (①)★ちゃんとiFileContentの中身には、97が入っている! fwriteでiFileContentの内容を出力するようにしているので、97が標準出力に出力されて欲しい!★ 17(gdb) n 1841 if (iRet < 1){ // 書き込めなかったら 19(gdb) p iRet 20$3 = 1 21(gdb) n 2225 while(TRUE){ 23(gdb)
terminal
1ユーザー名@コンピュータ名 修正後 % ./a.out test.txt (②) 2aaa 3bbb 4ccc 5ddd 6ユーザー名@コンピュータ名 修正後 %
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/18 01:03 編集
2021/01/18 03:27
2021/03/19 06:48