这让我发疯了。我想从子目录(./method/CoyoteAdapter.java.tk.method.514.5.533.5.bk)中读取,但我的代码在fscan崩溃(总线错误):
void readFrag( int **sequence, int& nTokens, char* fragName )
{
FILE *file;
char tmp[200];
strncpy(tmp, &fragName[2], 198);
char szWorkingDirectory[PATH_MAX];
szWorkingDirectory[0] = '\0';
getwd(szWorkingDirectory);
printf("Attempting to open %s/%s\n", szWorkingDirectory, tmp);
file = fopen(tmp, "r");
nTokens = 0;
fscanf(file, "%d", &(*sequence)[nTokens]);
while(!feof (file))
{
fscanf(file, "%d", &(*sequence)[nTokens]);
++nTokens;
}
fclose(file);
}
// maxFragSizes: Each block has its max frag size
void init( int **seq, int& seqSize, int **sub, int& subSize, int **problemSizesPerBlock, char* fragListName )
{
FILE *file;
char line[200];
int* tokens = new int[THREADS_PER_BLOCK-1];
int nTokens = 0;
file = fopen(fragListName, "rt");
while(fgets(line, 200, file) != NULL)
{
readFrag( &(*seq), nTokens, line );
}
fclose(file);
}
但是,如果我将文件复制到我的目录,它就可以了。我在UNIX(Mac OS)上。请帮忙!
编辑:我按照建议添加了以下代码。输出没问题,但它仍然不起作用......
答案 0 :(得分:2)
您必须验证文件指针。可能是找不到文件,或者您没有足够的权限来阅读它。
file = fopen(fragName, "rt");
if(file==NULL)
{
printf("\nFile not found");
return 0;
}
fscanf(file, "%d", &tmp);
答案 1 :(得分:2)
AVD is almost right - 您需要检查FILE*
fopen(3)
以查看您是否确实打开了该文件。但他的答案(和selbie's similar answer)都忽略了最重要的一条信息: fopen(3)
失败的原因。
试试这个:
void readFrag( char* fragName )
{
FILE *file;
int tmp;
file = fopen(fragName, "r");
if (!file) {
perror("Error reading fragment file in readFrag");
return;
}
fscanf(file, "%d", &tmp);
}
我还从模式中删除了t
,因为我找不到任何支持其使用的文档。我希望这个不是问题的原因 - 人们希望图书馆会更加严谨 - 但因为它是无效的输入,它肯定可能是错误的。 (检查系统的fopen(3)
联机帮助页,如果我对您的平台有误,请请纠正我。)
答案 2 :(得分:1)
在调用fscanf之前,您没有检查fopen()返回的“file”是否为NULL。这就是你崩溃的原因。
至于如何打开文件,您可能需要调用getcwd(getwd)并打印结果以查看您是否在您认为自己所在的父目录中。您可能不需要“./ “文件路径中的前缀,但我认为它不会受到伤害。
void readFrag( char* fragName )
{
FILE *file;
int tmp;
char szWorkingDir[PATH_MAX];
szWorkingDirectory[0] = '\0';
getwd(szWorkingDirectory);
printf("Attempting to open %s/%s\n", szWorkingDir, fragName);
file = fopen(fragName, "rt");
if (file != NULL)
fscanf(file, "%d", &tmp);
}
int main()
{
readFrag("method/CoyoteAdapter.java.tk.method.514.5.533.5.bk");
return 0;
}
答案 3 :(得分:0)
您传递给init函数的seq
的值很可能不会指向指向有效内存的指针(seq
本身无效,或者*seq
是)