fgetcを使用してファイルから負の数値を読み取る方法は?ファイルと構造を含むCプログラミング
答えて
数字はどのようにコード化されていますか?
ASCIIの場合は、複数の文字が必要です。ループを書くことができますが、fscanf
ヘルプがあります。
バイナリデータの場合、fgetc
は8ビットしか読み込まないということを覚えておいてください。もう一度効率的に行うには他の機能について考える必要があります。ここ
ポイントは本当にあなたがちょうどあなたの缶、fgetc
はおそらく間違った答えであることを証明するためにそれをやっている場合を除きということです。たぶんfgets
?
fgetc()は、文字を「符号なしの文字」として解釈しますが、intにキャストします(ただし、ファイルの最後に-1のEOFを返します)。
ソースファイルにという表現の符号付き値のが含まれている場合は、それをデコードする必要があります。
fgetc
は、一度に1文字ずつ読み込みます。ファイルまたは任意の番号から負の数を読み取ろうとする場合は、fscanf
を使用します。
#include <stdio.h>
main()
{
int v;
fscanf (stdin, "%d", &v);
printf ("v = %d\n", v);
}
'0' '1'、ASCII値0x30のを持っている0x31である...と、これまで... はあなたのファイルに一つだけの数を持っていると仮定すると:私は
FILE * pFile;
int c, n = 0;
bool negative;
pFile=fopen ("myfile.txt","r");
if (pFile==NULL){
perror("Error opening file");
}else{
c = fgetc (pFile);
negative = (c == '-');
do {
c = fgetc (pFile);
if (c>=0x30 && c<=0x39) {
n = n*10 + (c-0x30);
}
} while (c != EOF);
fclose (pFile);
}
if(negative==true) n=n*-1;
printf ("Your number: %d\n",n);
チャーリーとの比較では、fgetcを複数回呼び出すよりもはるかに優れた方法がありますが、その関数の使用を主張する場合は、各charを評価するループを実行する必要があります。また、データのエンコード方法にも依存します。それがアスキーの場合(charを返すfuncを使用する場合)、最初のcharが " - "であるかどうかを確認し、その後の各charをatoi(const char *)でintに一度に1つずつ変換し、新たな値を追加する前に、結果の値を各反復ごとに10ずつ戻します。より良い方法は、いくつかの文字(fgetsか何かを使用して)を読み込み、次にchar *をatoi(const char *)で変換することです。たぶんあなたがより明確に説明した場合、より良い答えを出そうとしていたものが提供される可能性があります。指定したとおりにデータがフォーマットされていないと、fscanfの使用が失敗することに注意してください。しかし、fscanfは本当にこの問題のあなたの答えです。
タイトルの「構造」がバイナリを意味する場合、おそらくfread()を使用したいと思うかもしれませんが、実際にバイナリファイルに格納されている整数のレイアウトが何であるかという質問を追跡しているなら、 fgetc()。
このコードは、ユニオンを使用して一連の読み取りバイトを整数に戻す方法を示しています。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
union Integer
{
int intPart_;
char charPart_[4];
};
int main(int argc, char* argv[])
{
FILE* pFile = fopen("integerFile.dat", "w");
int intWritten = -257;
size_t bytesWritten = fwrite(&intWritten, 1, sizeof(int), pFile);
assert(bytesWritten == sizeof(int));
fclose(pFile);
pFile = fopen("integerFile.dat", "r");
int intRead = 0;
size_t bytesRead = fread(&intRead, 1, sizeof(int), pFile);
assert(bytesRead == sizeof(int));
printf("%d\n", intRead);
fclose(pFile);
pFile = fopen("integerFile.dat", "r");
Integer intToRead;
for(int i = 0;
i != sizeof(int);
++i)
{
int byteRead = fgetc(pFile);
intToRead.charPart_[i] = byteRead;
printf("%d\n", byteRead);
}
printf("%d\n", intToRead.intPart_);
fclose(pFile);
return 0;
}
なしオーバー/アンダーフローチェックあなたは、戻り値のチェックWITH fscanfを使用することができます。
#include <stdio.h>
int main()
{
int v;
if(1==fscanf(yourfilepointer, "%d", &v))
printf ("v = %d\n", v);
else
fputs("error on reading v",stderr);
return 0;
}
- 1. (C/C++)構造体を含む共用体を含む構造体...?
- 2. Cプログラミングとデータ構造
- 3. ダイナミックフィールドを含むデータベース構造
- 4. クラスと構造体を含むコンストラクタ/デストラクタ
- 5. 代数構造とプログラミング
- 6. ポインタを含むベクトルを構造体VS構造体にソート
- 7. Cでローカルポインタを含む構造体を返す
- 8. C#:配列を含む構造体をマーシャリングする
- 9. 配列を含む構造体のサイズ
- 10. クラスasメンバーの構造体を含む
- 11. 配列を含む構造体
- 12. C#文字列の配列を含む構造体のdllimport
- 13. System.Numerics.Vectorを含む構造体へのポインタC#の<double>
- 14. 他の構造体を含むバイナリファイルから構造体を読み込んで読み込む(C)
- 15. 構造体を含むMySQLへのCSVファイルのインポート
- 16. C#の配列として配列を含む構造体ポインタを渡す
- 17. フォルダーごとにx個のファイルを含むフォルダー構造を作成する
- 18. 構造体とメモリをクリアするフリー関数:Cプログラミング
- 19. 文字列を含む構造体をバイナリファイルに書き込む
- 20. 配列を含む構造体をバイナリファイルに書き込む
- 21. リンクリストと構造体を含むサンプルプログラムは動作しません
- 22. ファイルを構造体に読み込む(C++)
- 23. C:構造体をリンクリストに読み込む(ファイルから)
- 24. C言語、ファイルの構造
- 25. C#他のファイルを含む
- 26. C++構造とベクトル
- 27. C++の構造体に単語ごとに.txtファイルを読み込む
- 28. Cプログラミング。構造体をディープコピーする方法は?
- 29. Cプログラミング - 構造体2D配列を初期化する
- 30. プライベート構造体のベクトルを含むクラスをエクスポートする方法