gpt4 book ai didi

c - 从未定义长度的文件中读取,存储在数组中,段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:05 25 4
gpt4 key购买 nike

我想打开一个文件,读取它的内容并使用 C 代码将它存储在一个数组中。

我在我的 Windows 笔记本电脑上完成了它并且它可以工作但是当我在我的 Raspberrypi 上尝试代码时我遇到了段错误。我已经尝试调试了一段时间,我对 C 还很陌生,所以我很难找到我做错了什么。

    char *readFile(char *fileName)
{
FILE *ptr_file;
char *ptr_data;
int n = 0;
char c;

ptr_file = fopen(fileName, "r");
if(ptr_file == NULL)
{
perror("File could not be opened.\n");
exit(EXIT_FAILURE);
}
fseek(ptr_file, 0, SEEK_END);
long f_size = ftell(ptr_file);
fseek(ptr_file,0, SEEK_SET);
ptr_data = (char *)malloc(f_size+1);

if(ptr_data == NULL)
{
perror("MALLOC FAILED");
exit(EXIT_FAILURE);
}

while((c = fgetc(ptr_file)) != EOF)
{
ptr_data[n++] = (char)c;

}
ptr_data[n] = '\0';
fclose(ptr_file);
return ptr_data;
}

在我看来,在调用 malloc 之后,段错误似乎出现在 while 循环中。

为什么它可以在我的笔记本电脑上运行,而不能在 raspberrypi 上运行?

与此同时,我不明白为什么如果我这样做,我的 RPi 会出现段错误:

   int main(int argc, char *argv[])
{
char data[100] = {};
FILE *ptr_file;
char *ptr_data=data;
int n = 0, i = 0;
char c;

ptr_file = fopen(fileName, "r");
if(ptr_file == NULL)
{
perror("File could not be opened.\n");
exit(EXIT_FAILURE);
}

while((c = fgetc(ptr_file)) != EOF)
{
ptr_data[n++] = (char)c;

}
ptr_data[n] = '\0';
while(i <n,i++)
{
printf("%c\n",data[i]);
fclose(ptr_file);

}

返回0;

最佳答案

在不同环境下读取文本文件时会出现一些问题。例如,当写一个新行时,在 Windows 上可能消耗 2 个字节,而在 Linux 上只消耗 1 个字节。来自一篇文章:

Subclause 7.21.9.4 of the C Standard [ISO/IEC 9899:2011] specifies the following behavior for ftell() when opening a text file in text mode: For a text stream, its file position indicator contains unspecified
information, usable by the fseek function for returning the file
position indicator for the stream to its position at the time of the
ftell call.
Consequently, the return value of ftell() for streams opened in text mode should never be used for offset calculations other than in calls to fseek().

换句话说,fseek 和 ftell 函数行为可能会有所不同,具体取决于您使用的环境。
如需进一步说明,您可以阅读本主题: https://www.securecoding.cert.org/confluence/display/seccode/FIO14-C.+Understand+the+difference+between+text+mode+and+binary+mode+with+file+streams

关于c - 从未定义长度的文件中读取,存储在数组中,段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com