-1

こんにちは、逆の方法で出力するために fscanf をデータ型に格納しようとしていますが、実行できません。

ここに私のコードがあります

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

int main(int argc, char *argv[])
{
    FILE* input;
    FILE* output;

    input = fopen(argv[1],"r");
    output = fopen(argv[2],"w");

    int zipcode, population;
    while(fscanf(input,"%d %d\n",&zipcode, &population)!= EOF)
    {
        fwrite(&population, sizeof(int), 1, output);
    }
    return 0;
}

これが私がやろうとしてきたことです

for(i = fscanf(input,"%d %d\n",&zipcode, &population); i!=EOF; i++)
    {
        fwrite(&population, sizeof(int), 1, output);
    }
4

3 に答える 3

1

システム上でマシンに依存する内部表現を移植不可能に出力することにより、fscanfのポイント(ポータブルでマシンに依存しないデータ入力を提供するため)を見逃したと思いますint

200から「2」をどのように取得しますか?200 / 100結果は2になります。これは256から「2」を取得することと何か違いがありますか?

256から「5」をどのように取得しますか?%除算の余りを取得するためにモジュロ()演算子を使用したことがありますか?256 % 100結果は5656 / 10になります。結果は5になります。

「6」はどうですか?6と2をどのように交換しますか?上記のアルゴリズムを使用して2を「100の倍数」列に抽出し、6を「1の倍数」列に抽出したとすると、6が「の倍数」になるように入れ替えることはできません。 100 "列と2つは"1の倍数"列にありますか?このアプローチを使用して、リトルエンディアン、ビッグエンディアン、または任意の混合エンディアンで移植可能に出力できます...また、リトルエンディアン、ビッグエンディアン、または任意の混合エンディアンで移植可能に入力する逆のアプローチがあります。あなたはそれを解決できますか?

0x1f23から0x1fをどのように取得しますか?その数から0x23をどのように取得しますか?興味深いことに、これらの「バイト」(技術的にはオクテット)は、同じアプローチ(除算とモジュロ)を使用して抽出できますが、基数が異なります。10の代わりに0x100、100の代わりに0x10000、1000の代わりに0x1000000などです。ほとんどの数値システムに当てはまります:2進数、8進数、10進数、16進数...おそらくもっと興味深い実験は、LSB(最下位ビットが最初)とMSB(最上位ビットが最初)の両方に対して、ポータブルベースの負の2入力/出力を実装することです。 。

編集:実際、コメントで説明した結果を達成するためのより簡単な方法があります。10を法とする整数を取得し、それを10進数として出力します。次に、整数を10で割り、この数値を整数として続けます。整数がゼロになるまで、これらの2つの手順を繰り返します。

于 2013-03-24T04:31:45.820 に答える
1

たとえば、データを逆に印刷するには、次のpopulation = 123456ように printf します654321。簡単な方法は次population のとおりですintstrrev()文字列を逆に出力する関数を定義します

あなたのコメントから私が理解しているように、あなたのファイルは次のzipcodeようpopulation なものです。

 46804 3450103 37215 1337 47906 46849

代替番号を出力ファイルに書き戻したい場合は、次のようにします(コードを理解するにはコメントを読んでください):

#include<stdio.h>
#include<string.h>
#define SIZE 50
void strrev(char* st) {// string reverse function()
  char* f = st;      // points to first
  char* l = st + strlen(st) -1;  // points to last char
  char temp;  
  while(f < l){
    // swap two chars in string at f & l memory
    temp = *f;
    *f = *l;
    *l = temp;

    f++;
    l--;
  }
}
int main(int argc, char* argv[]){
    if(argc!=3) return 0;
    FILE* input  = fopen(argv[1],"r");
    FILE* output  = fopen(argv[2],"w");
    int zipcode;
    char population[SIZE] = {0};
    while(fscanf(input,"%d %s\n",&zipcode, population)!= EOF){
        // population is always alternative number 
          strrev(population);    // reverse the string 
        //printf("%s\n",population);
          fprintf(output,"%s ",population);  // write in output file
    }
    return 1;
}

これは次のように機能します。

:~$ cat inputfile 
 46804 3450103 37215 1337 47906 46849
:~$ ./a.out  inputfile outputfile
~$ cat outputfile 
3010543 7331 94864

これは一種の単純な解決策です。

EDITコメントしているため、バイナリダンプファイルが必要です。したがって、バイナリ形式の出力ファイルが必要だと思います。出力ファイルをバイナリモードで開き、書き込み関数を使用するだけです。このために、私は部分的なコードを書いています(再びコメントを読んでください):

FILE* output  = fopen(argv[2],"wb");  
    //                             ^  open in write binary mode
int val;   // an extra variable int
while(fscanf(input,"%d %s\n",&zipcode, population)!= EOF){
      strrev(population);   // revers string        
      val = atoi(population);  // convert strint to int
      fwrite(&val,sizeof(int),1,output); // write in binary file
}
于 2013-03-24T04:54:42.287 に答える
0

エンディアンを変換するには、このリンクを参照できます: C でビッグ エンディアンをリトル エンディアンに変換 [提供された関数を使用せずに]

それ以外の場合は、例として以下の関数を参照できます

int convert_endian(int n)
{
    int num = 0;
    while(n > 0) {
        num = (num * 10) + (n %10);
        n = n / 10;
    }
    return num;
}
于 2013-03-24T08:01:56.023 に答える