gpt4 book ai didi

c - c 中的 getline() 更改我的数据并导致内存错误

转载 作者:行者123 更新时间:2023-11-30 17:38:49 24 4
gpt4 key购买 nike

我正在尝试在 Xcode (5.0.2) 中编写一个 C 程序来读取文件并用它做一些数学运算,我希望有人能告诉我我做错了什么。我的代码读取 csv 的每一行(尝试过 txt,同样的问题),用它执行一些计算,然后丢弃该行。

计算似乎工作正常,但我在 getline() 表现得很奇怪时遇到了麻烦。这是我的功能:

void fileRead(int** matrixOfResults) {
char filePath[] = "/path/to/file.csv";
FILE * file;
char fileMode[] = "r";
ssize_t linelen;
size_t linecap = 0;
char *line = NULL;

file = fopen(filePath, fileMode);
while ((linelen = getline(&line, &linecap, file)) > 0) {
// reads line and does the math. doesn't seem to cause problems
performSomeCalculations(line, matrixOfResults);
free(line);
line = NULL;
}
fclose(file);
}

每次我运行它时,它都会在不同的地方失败(是的,各种各样!)。它读入某些行时完全正常,但随后崩溃,通常在 50-200 行之间。

出错的一个地方是误读了我的输入数据。这是一个例子:

(char *) line = 0x0000000100300080 "26,581,856,1029,1598,1856,3000,4567,6742,7013,8293,8365,8696,9055,9064,9496,9497,10698,10830,**10975,20886**,11294,11452,12040,12630,13757,13991\n"

我检查了原始文件中的同一行:

26,581,856,1029,1598,1856,3000,4567,6742,7013,8293,8365,8696,9055,9064,9496,9497,10698,10830,**10875,10886**,11294,11452,12040,12630,13757,13991

它似乎也经常将 , 更改为 - ,以及将数字更改为冒号。

我还收到一堆 EXC_BAD_ACCESS 错误,主要是在同时分配行或尝试释放行时。 performSomeCalculations 函数将 line 作为 const,因此不会在某处进行修改。

最佳答案

您必须在第二个参数中传递有效值,请参阅 the documentation 。此 [in,out] 参数返回调用后缓冲区的大小。但它还应该指示缓冲区的大小。当您释放内存并将第一个参数中的指针设置为 NULL 时,您必须将 linecap 设置为零。

char **lineptrsize_t *n 是一对参数,传递行缓冲区的地址和大小。当您删除并更改大小信息时,您的代码会以不同的方式对待它们。

更好的方法是让 linelinecap 保持不变,直到循环结束。最后删除就可以了。

关于c - c 中的 getline() 更改我的数据并导致内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22024037/

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