gpt4 book ai didi

c - fscanf 总线错误 : 10 when switching from Snow Leopard to Lion

转载 作者:行者123 更新时间:2023-12-03 16:36:25 24 4
gpt4 key购买 nike

首先,此代码段不适用于生产代码。所以,请不要谈论它“不安全”。谢谢!

因此,以下代码是解析器的一部分,该解析器接收 csv 并使用它来填充 sqlite3 数据库。在 Snow Leopard 中编译和运行时,它工作得很好。现在我已经切换到 Lion,scanf 语句抛出总线错误:10。具体来说,它似乎与我如何使用和丢弃每行末尾的“\n”有关:

int main()
{
sqlite3* db;
sqlite3_open("someExistingDB.sqlite3", &db);

FILE *pFile;
pFile = fopen("excelData.csv","r");

char name[256],country[256], last[256], first[256], photoURI[256];
char sqlStatement[16384];

while(fscanf(pFile, "%[^,],%[^,],%[^,],%[^,],%[^\n]%*c", name, country, last,first, photoURI) != EOF)
{
blah...

...

如果我删除最后一个 %*c,这意味着消耗 '\n' 并忽略它以便前进到下一行,程序不会崩溃。但是当然会进行不正确的解析。

此外,请注意,EOF 似乎不是问题所在;我还尝试了一个 fscanf 语句而不是上面显示的 while 循环。

有什么想法吗?

编辑:让我补充一点,代码最初是在装有 Snow Leopard 的英特尔核心双核(32 位)macbook 中编译和运行的,现在我正在编译它并在装有 Lion 的 MacPro(64 位)上运行。所以我想知道这是否与对齐有关?

最佳答案

很有趣。总线错误通常是由于对齐问题引起的,但这里可能不是这种情况,因为您扫描的只是 chars。

可能要考虑的一件事是将整行fgets 放入缓冲区,然后sscanf。这将允许您做两件事:

  • sscanf 之前(或在扫描之后,如果预期的转换计数错误)打印出调试语句中的行,以便您查看是否有任何问题;和
  • 不必担心尝试将行尾与 fscanf 对齐,因为 fgets 已经在这方面做得很好。

所以它会是这样的(未经测试):

char bigHonkinBuffer[16384];
while (fgets (bigHonkinBuffer, sizeof(bigHonkinBuffer), pFile) != NULL) {
if (sscanf(bigHonkinBuffer, "%[^,],%[^,],%[^,],%[^,],%[^\n]", name, country, last,first, photoURI) != 5) {
// printf ("Not scanned properly: [%s]\n", bigHonkinBuffer);
exit (1);
}
}

您还应该检查 sqlite3_openfopen 调用的返回值,如果这不仅仅是“播放”代码(即,如果有丝毫可能这些文件可能不存在)。

关于c - fscanf 总线错误 : 10 when switching from Snow Leopard to Lion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693924/

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