如何存储fscanf以反向顺序打印?

时间:2013-03-24 04:06:33

标签: c

您好我正在尝试将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);
    }

3 个答案:

答案 0 :(得分:1)

我认为您错过了fscanf(提供便携式和机器无关的数据输入)的意义,因为它无法在您的系统上输出int的机器相关内部表示。

你怎么能得到200分中的'2'? 200 / 100导致2.这与256中的'2'有什么不同吗?

你如何从256获得'5'?您是否曾使用模(%)运算符来获得除法的余数? 256 % 100结果为56. 56 / 10结果为5。

'6'怎么样?你会如何交换6和2?假设您已经使用上面的算法将2提取为“100的倍数”列,并将6提取为“一的倍数”列,您不能交换它们以使6位于“倍数”一百个“列和两个位于”一列的倍数“列?您可以使用这种方法以小端,大端或任何您喜欢的混合字节顺序输出...并且有一种反向方法可以在小端,大端或任何混合字节序中进行可移植输入。你可以解决这个问题吗?

你如何从0x1f23获得0x1f?你怎么从这个数字中得到0x23?有趣的是,你可以使用相同的方法(除法和模数)提取这些“字节”(八位字节,技术上),但不同的基数:0x100而不是10,0x10000而不是100,0x1000000而不是1000,等等。事实上,这个适用于大多数系统:二进制,八进制,十进制,十六进制......也许更有趣的实验可能是实现便携式基本负两输入/输出,LSB(最低有效位优先)和MSB(最高有效位优先)

编辑:实际上,有一种更简单的方法可以实现您在注释中描述的结果:获取整数模10,并将其打印为十进制数字。然后将整数除以10,并将此数字作为整数继续。重复这两步,直到整数为零。

答案 1 :(得分:1)

要反向打印您的数据,例如population = 123456,您想要像654321一样打印。简单的方法是:在字符串中读取population而不是int。并定义strrev()函数以反向打印字符串

我从您的评论中了解到,您的文件是一系列zipcodepopulation 类似的东西:

 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

这是一种简单的解决方案。

编辑因为您正在发表评论,所以您需要二进制转储文件。所以我认为你需要二进制格式的outfile:只需在二进制模式下打开输出文件并使用write函数。为此,我正在编写部分代码(再次阅读评论):

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
}

答案 2 :(得分:0)

要转换字节数,您可以参考以下链接:convert big endian to little endian in C [without using provided func]

否则,您可以参考下面的函数作为示例

int convert_endian(int n)
{
    int num = 0;
    while(n > 0) {
        num = (num * 10) + (n %10);
        n = n / 10;
    }
    return num;
}