c - C中文件操作中的段错误

标签 c file gcc segmentation-fault

我正在尝试使用动态内存分配从文件中删除多余的空格和换行符,但出现内存段错误。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(int argc,char **argv)
{
 FILE*fp;
 char ch;
 char *p;
 int i=0,size;
 if((fp = fopen(argv[1],"r"))==NULL) 
   {
    printf("Couldnt open file\n");
    return;
   }

 fseek(fp,0,2);
 size=ftell(fp);


 p = calloc(1,size+1);
 rewind(fp);
 while((p[i] = fgetc(fp))!=EOF)
 {
   i++;
 }
 p[i]=EOF;

 fclose(fp);

 for ( i=0; p[i]!=EOF; i++)
 {
  if (p[i] == ' ' && p[i+1] == ' ')
   {
     memmove(p+i,p+i+1,strlen(p+i+1));
     i--;
   }
  if (p[i] == '\n' && p[i+1] == '\n')
   {
     memmove(p+i,p+i+1,strlen(p+i+1));
     i--;
   }
 } //all extra spaces and newlines deleted..

fp = fopen("modified","w");
if (fp==NULL)
{
 printf("coudlnt create\n");
 return;
}

i=0; 

while((fputc(p[i],fp))!=EOF)
 {
    i++;
 }
   fclose(fp);
 }

我在上面的程序中遇到段错误(核心转储),如果我用 strlen(p+i+2) 修改 memmove 指令,那么它不会给出段错误,但会陷入某种无限循环。请告诉我我哪里出错了。

最佳答案

你的文件读取被破坏了; EOF 不是字符,因此您无法将字符与它进行比较并获得正确的结果。

改为使用 fread() 读取整个文件。请注意,它可能会返回更短的长度,并且无论如何都需要循环。

同时停止使用strlen();您知道分配缓冲区和读入文件时的长度,因此就性能而言,像您一样一直使用strlen() 是非常浪费的。

关于c - C中文件操作中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990445/

相关文章:

c - fork : number of processes created

python - 任意 C 项目的预处理

java - Jave 从文件读取视频/音频编解码器

编译器 : Understanding assembly code generated from small programs

c++ - 编译netbean时出错

更改节点 libxml2 的命名空间

c - 是否有使用 C 读取 Excel 文件的 FOSS 库

c - 在一定时间后中断主循环内的函数

mysql - 多个表使用多个联结表引用一个表

javascript - 删除和重建文件输入时清除文件列表