【发布时间】:2015-02-27 03:25:56
【问题描述】:
我正在尝试使用 fscanf 和 fwrite 将字符串和整数转换为二进制,以将它们写入输出文件。
我的输入文件:
a 100
ab 99
abc 98
abcd 97
abcde 96
每行分隔字符串和 int 的每个空格都是一个制表符。
这是我的 main.c 文件,魔法应该发生(但不是):
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 30
int main(int argc, char * argv[]){
FILE *ifp;
FILE *ofp;
if(argc != 4){
fprintf(stderr, "Usage: flag %s input-file output-file\n", argv[0]); exit(1);
}
if((ifp = fopen(argv[2], "r")) == NULL){ /* error check to make sure the input file is open*/
fprintf(stderr, "Could not open file: %s", argv[2]); exit(1);
}
puts("input file open\n");
if((ofp = fopen(argv[3], "wb")) == NULL){ /* Opens output file to write in binary*/
puts("couldnt open output file\n"); exit(1);
}
puts("output file open\n");
unsigned char tempstr[MAX_LEN];
unsigned int tempint;
while(fscanf(ifp, "%u %u\n",(unsigned int*)&tempstr, &tempint) == 2){
fwrite((const void*)&tempstr, sizeof(tempstr)+1, 1, ofp);
fwrite((const void*)&tempint, sizeof(unsigned int), 1, ofp);
puts("ran loop");
}
fclose(ifp);
return 0;
}
当我运行我的代码时,我的 while 循环似乎没有运行(即“运行循环”没有被输出)。不知道从这里去哪里?
另外我在命令行的调用如下:
./a.out main.c t1.txt t1.bin
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
fwrite((const void*)tempint, sizeof(unsigned int), 1, ofp);-->&tempint对于初学者 -
可能是
fwrite(tempstr, strlen(tempstr)+1, 1, ofp);,但我不确定你想怎么读回来。会帮助更多,但 GTG -
也只是 tempstr 的大小为 1 吗? (是 sizeof(unsigned char) )。它需要足够长以容纳第一个字段的最大大小(加上空终止符)
-
尝试使用 -Wall -Wextra 编译您的代码并首先删除所有警告。您的代码生成的警告将为您指明正确的方向。
-
我只是将 tempstr 和 tempint 更改为 &tempstr 和 &tempint。我添加了一个#define MAX_LEN 30 然后做了 unsigned char tempstr[MAX_LEN)];