【问题标题】:Converting strings and ints from input file and printing to output file从输入文件转换字符串和整数并打印到输出文件
【发布时间】: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); --> &amp;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)];

标签: c scanf fwrite


【解决方案1】:

我相信这应该可以消除 seg 错误。

  1. 类型应该是char * 而不是unsigned char *
  2. 数组应该有足够的空间来容纳所需的字符和空终止符。

.

char tempstr[30];
unsigned int tempint;

while (fscanf(ifp, "%s \t %i\n",tempstr, &tempint) == 2 ) {
    fwrite((const void*)&tempstr, sizeof(tempstr)+1, 1, ofp);
    fwrite((const void*)&tempint, sizeof(unsigned int), 1, ofp);
    puts("ran loop");
}

另外我猜你在执行./a.out ... 等时不需要main.c。你可以在代码中更改检查argc != 3 而不是4

【讨论】:

  • 好的,这实际上让循环运行了。那么现在 t1.txt 中的所有信息现在都在 t1.bin 中了吗?
  • 不完全是。尝试阅读fwrite() 的文档。另外,打印到控制台,看看sizeof(tempstr) 给你什么。您需要%ld 而不是%d 作为printf() 的格式说明符
  • 好的,所以 sizeof(tempstr) 给了我 30,就像你设置的大小一样。这是有道理的,我试图将输入文件每一行中的信息转换为二进制文件,然后转换为我想要 fwrite 的输出文件,对吗?
  • 你能告诉我 fwrite 正在写入我的输出文件吗?
  • 我认为,它也是在循环中写入每次越界的垃圾值。
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多