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

时间:2018-10-22 21:46:44

标签: c string segmentation-fault

晚上好!我现在的目标只是做些小事,以读取任何类型文件中的字符(并将它们放入字符串中以供以后在程序中使用),但我目前一直遇到一个问题,即我在运行代码及其时“ 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++;
}

3 个答案:

答案 0 :(得分:3)

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

您正在寻找的内容在How do you determine the size of a file in C?

中进行了讨论

答案 1 :(得分:2)

进行段故障的原因是因为以下这一行:

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

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

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

如何避免这种情况?

由于您仅尝试读取字符,因此可以简单地进行操作:

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

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

答案 2 :(得分:0)

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

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

  1. 打开文件
  2. 分配结果缓冲区
  3. 阅读char
  4. 如果EOF然后关闭文件,则附加零字节并返回缓冲区。
  5. 将char附加到缓冲区
  6. 如果缓冲区末尾以两倍的缓冲区大小重新分配。
  7. 从3继续