首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的文件I/O困难

C语言中的文件I/O困难
EN

Stack Overflow用户
提问于 2011-02-10 23:10:40
回答 5查看 330关注 0票数 3

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

我的main方法是这样的

代码语言:javascript
复制
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;
}

parse_file方法如下所示

代码语言:javascript
复制
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

}

}

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

所以,我的问题是:

1-警告"makes from pointer without cast“是关于什么的?我能做些什么来解决这个问题?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-10 23:14:25

  1. 您正在对一个字符串调用putchar (" "),但它需要一个char参数(' ')。(实际上是一个int,但只传递一个char是安全的。)
  2. 段错误可能是由于fp上的fclose造成的,它可能是NULL。您应该检查fopen的返回值。您只注意到parse_file之后的原因是它根本不接触fp (它从stdin读取并写入stdout)。要使用流fp,您应该使用getc(fp)putc(fp)。(这仍然是行不通的,因为您将用比从中读取的数据更多的数据覆盖流,因此您将得到垃圾。)

事实上,当没有给出命令行参数时,程序肯定会出现segfault。要么是因为接收到空指针argv[1]而导致fopen分段错误,要么是因为它本身返回了一个空指针。

在编写这类程序时,请遵循Unix的理念,将它们写成filters:从stdin读取,写入stdout。如果没有必要,不要就地修改文件。

票数 5
EN

Stack Overflow用户

发布于 2011-02-10 23:12:55

您必须使用

代码语言:javascript
复制
putchar(' ')

相反,

代码语言:javascript
复制
putchar(" ")
票数 8
EN

Stack Overflow用户

发布于 2011-02-10 23:15:23

在C语言中,字符串文字的类型是char *,即指向包含字符串字符的某个区域的指针。" "是字符串文字,而不是字符。如果需要单个字符,请使用' '

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4958793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档