在 C 中读取文件时出现分段错误



晚上好!我现在的目标只是做一些小的东西来读出任何类型的文件中的字符(并将它们放入字符串中以供稍后在程序中使用(,但我目前一直遇到一个问题,当我运行代码时,它在"input[n] = (char(c;"行处分段错误,我尝试通过打印字符和 n 的值进行故障排除, 每次(尽管我将 malloc 更改为不同的大小(printf 语句都会在数字"134510"中途打印,或者在下面一行出错之前在偏移134509处打印字符。我想知道我的问题是什么以及如何解决它,因为该程序只能通过大约 10% 的文件对我来说很奇怪。

谢谢!!

int c = 0; //Counting the current character being read
int n = 0; //Counting the current character being written
char *input; //A string of all characters in the file
FILE *inputFile; //File to read
if(!(inputFile = fopen(argv[1],"r"))){  // Open in read mode
printf("Could not open file");   // Print and exit if file open error
return 1;
}
input = (char *)malloc(sizeof(inputFile) * sizeof(char));
while (1){  //Put all of the characters from the file into the string
c = fgetc(inputFile);
if(feof(inputFile)){ //If it reaches the end of the file, break the loop
break;
}
printf("%c ", c); //Troubleshooting
input[n] = (char)c;
n++;
}

问题是sizeof(inputFile)不返回文件的大小。它返回FILE*指针的大小(以字节为单位(;该指针的大小与基础文件的大小完全无关。

您正在寻找的内容在如何确定 C 语言中文件的大小?

你之所以出现段错误,是因为这一行:

input = (char *)malloc(sizeof(inputFile) * sizeof(char));

错误地标记文件的大小可能看起来是正确的;但是,您获得的是inputFile指针的大小。这与常规文件完全不同,因为指针在大多数计算机上只有 4 个字节!

这意味着您只分配 4 个字节的数据。

你如何避免这种情况?

由于您只是尝试读取字符,因此您可以简单地:

while ((int)(result = getline(&line, &capacity, inputs)) != -1)

这将读取整行,您可以将该行放入另一个字符 *。

您不必事先知道文件大小。

您可以使用下面描述的方法:

  1. 打开文件
  2. 分配结果缓冲区
  3. 读取字符
  4. 如果 EOF 则关闭文件,附加零字节并返回缓冲区。
  5. 将字符追加到缓冲区
  6. 如果缓冲区重新分配结束时具有双倍缓冲区大小。
  7. 从 3 继续

相关内容

  • 没有找到相关文章