-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

To print you data in revers for example population = 123456 you want to printf like 654321. simple way is: read population in a string instead a int. and define strrev() function to print string in reverse

As I understand from your comments your file is a sequence of zipcode and population something like:

 46804 3450103 37215 1337 47906 46849

and you want to write alternative numbers back to some output file, do like this(read comments to understand code):

#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;
}

And this works as follows:

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

This is one kind of simple solution.

EDIT Because you are commenting you need binary dump file. So I think you need outfile in binary formate: Just open output file in binary mode and use write function. For this I am writing a partial code(again read comments):

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 回答
1

我认为您错过了 fscanf 的要点(提供可移植且与机器无关的数据输入),因为int您无法移植地输出系统上与机器相关的内部表示。

您如何从 200 中获得“2”?200 / 100结果为 2。这与从 256 中得到“2”有什么不同吗?

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

“6”呢?6和2怎么换?假设您已经使用上面的算法将 2 提取到“100 的倍数”列中,将 6 提取到“1 的倍数”列中,您不能交换它们以使 6 位于“的倍数”中吗?一百”列和两个位于“一的倍数”列?您可以使用这种方法以小端、大端或您喜欢的任何混合端方式便携式输出……还有一种相反的方法可以以小端、大端或您喜欢的任何混合端方式便携式输入。你能解决吗?

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

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

于 2013-03-24T04:31:45.820 回答
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;
}
于 2013-03-24T08:01:56.023 回答