C中的文件I/O困难

Jas*_*son 3 c unix

我正在编写一个Unix expand实用程序版本,用文件中的空格替换制表符.为此,我正在阅读每个角色并测试它是否是制表符.如果是,它将使用给定的空格量替换选项卡,否则将打印该字符.

我的主要方法是这样的

int main(int argc, char *argv[]){
 FILE *fp;

 char *help1="-help";
 char *help2= "--help";

 //int spaces; //number of spaces to replace tabs

 fp= fopen(argv[1], "rw");
 parse_file(fp, 4);
 fclose(fp);

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

parse_file方法就像

void parse_file(FILE *fp, int spaces)
{
  int i; //loop counter
  char c; //current character
  while (c!= EOF)
{
    c= getchar(); //get char from stream

    if (c=='\t') //if char is a tab
    {
        for (i=0; i< spaces; i++)
            putchar(" "); //replace with spaces

    } 
    else 
        putchar(c); //otherwise, print the character

}
Run Code Online (Sandbox Code Playgroud)

}

在编译时,我从指针获得一个没有强制警告的整数,putchar(" ");程序在执行时会遇到段错误.

所以,我的问题:

1-什么是警告"从没有强制转换的指针生成整数"的全部内容?我该怎么做才能解决它?

2-代码在执行时生成段错误,文本文件作为参数传入.这段代码中有什么东西会导致这种情况吗?

ana*_*nda 8

你必须使用

putchar(' ')
Run Code Online (Sandbox Code Playgroud)

代替

putchar(" ")
Run Code Online (Sandbox Code Playgroud)

  • @Tim Post:不,当然不是.`putchar(32)`既不便携也不清楚. (4认同)

Fre*_*Foo 5

  1. 你正在调用putchar一个string(" "),但它需要一个char参数(' ').(实际上是一个int,但只通过一个char是安全的.)

  2. 段错可能是因为fcloseon fp,可能是NULL.您应该检查返回值fopen.你之后才注意到的原因parse_file是它根本没有触摸fp(它读取stdin和写入stdout).要使用流fp,您应该使用getc(fp)putc(fp)不是.(这仍然无效,因为你用比你从中读取数据更多的数据来覆盖流,所以你会得到垃圾.)

实际上,当没有给出命令行参数时,程序肯定会出现段错误.段错误,fopen因为它是空指针argv[1],或者它返回一个空指针本身.

在编写这些类型的程序时,请遵循Unix哲学并将它们写为过滤器:读取stdin,写入stdout.如果不必要,请不要就地修改文件.