您好我正在尝试将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);
}
答案 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()
函数以反向打印字符串
我从您的评论中了解到,您的文件是一系列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
这是一种简单的解决方案。
编辑因为您正在发表评论,所以您需要二进制转储文件。所以我认为你需要二进制格式的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;
}