为什么我无法读取输入的文本文件?
Why can‘t I read the input text file?
我尝试使用 scanf 读取文件名但失败了。
我很不擅长指点,找不到问题所在。
指向字符串数组的指针有问题吗?
这是我的代码:
int* Read_file(char* str[])
{
FILE* fp = fopen(str[1], "r");
if(fp == NULL)
{
printf("File cannot open\n");
return NULL;
}
int rows = 0;
while(!feof(fp))
{
if(fgetc(fp) == '\n')
{
rows ++;
}
}
rows ++;
int* keys = (int*)malloc(3 * rows * sizeof(int));
fseek(fp, 0L, 0);
while(!feof(fp))
{
for(int i = 0;i < rows;i ++)
{
for(int j = 0;j < 3;j ++)
{
fscanf(fp,"%d", &keys[(3 * i) + j]);
}
}
}
fclose(fp);
return keys;
}
int main()
{
char* str[20];
printf("Build_tree ");
scanf("%s",&str);
int* keys = Read_file(str);
return 0;
}
好的,事情是这样的:
您需要一个字符数组来存储字符串(文件名)。所以你应该使用 char
数组。相反,您使用的是一个字符指针数组。
一个数组实际上就是一系列的内存块。数组的名称表示指向数组第一个元素的指针(在本例中为第一个 char
变量)。
在读取字符串时,scanf
需要一个位置来存储它。所以你需要给它你的 char
数组的第一个 char
变量的地址,它在你的 char
数组本身中可用。所以你只需要将 str
传递给 scanf
。在正常的 int
、float
和此类基本数据类型的情况下,它们的名称表示内存块而不是指向内存块的指针,因此您必须使用 &
.
然后对于 fopen
,fopen
需要一个 char*
(它指向存储文件名的字符数组的第一个字符)并且您必须为其提供一个 char*
。所以你应该传递 str
.
我认为你的代码应该像
int* Read_file(char str[])
{
FILE* fp = fopen(str, "r");
if(fp == NULL)
{
printf("File cannot open\n");
return NULL;
}
int rows = 0;
while(!feof(fp))
{
if(fgetc(fp) == '\n')
{
rows ++;
}
}
rows ++;
int* keys = (int*)malloc(3 * rows * sizeof(int));
fseek(fp, 0L, 0);
while(!feof(fp))
{
for(int i = 0;i < rows;i ++)
{
for(int j = 0;j < 3;j ++)
{
fscanf(fp,"%d", &keys[(3 * i) + j]);
}
}
}
fclose(fp);
return keys;
}
int main()
{
char str[20];
printf("Build_tree ");
scanf("%s",str);
int* keys = Read_file(str);
//Whatever you want to do with the keys
return 0;
}
对任何问题发表评论。
我尝试使用 scanf 读取文件名但失败了。 我很不擅长指点,找不到问题所在。 指向字符串数组的指针有问题吗? 这是我的代码:
int* Read_file(char* str[])
{
FILE* fp = fopen(str[1], "r");
if(fp == NULL)
{
printf("File cannot open\n");
return NULL;
}
int rows = 0;
while(!feof(fp))
{
if(fgetc(fp) == '\n')
{
rows ++;
}
}
rows ++;
int* keys = (int*)malloc(3 * rows * sizeof(int));
fseek(fp, 0L, 0);
while(!feof(fp))
{
for(int i = 0;i < rows;i ++)
{
for(int j = 0;j < 3;j ++)
{
fscanf(fp,"%d", &keys[(3 * i) + j]);
}
}
}
fclose(fp);
return keys;
}
int main()
{
char* str[20];
printf("Build_tree ");
scanf("%s",&str);
int* keys = Read_file(str);
return 0;
}
好的,事情是这样的:
您需要一个字符数组来存储字符串(文件名)。所以你应该使用 char
数组。相反,您使用的是一个字符指针数组。
一个数组实际上就是一系列的内存块。数组的名称表示指向数组第一个元素的指针(在本例中为第一个 char
变量)。
在读取字符串时,scanf
需要一个位置来存储它。所以你需要给它你的 char
数组的第一个 char
变量的地址,它在你的 char
数组本身中可用。所以你只需要将 str
传递给 scanf
。在正常的 int
、float
和此类基本数据类型的情况下,它们的名称表示内存块而不是指向内存块的指针,因此您必须使用 &
.
然后对于 fopen
,fopen
需要一个 char*
(它指向存储文件名的字符数组的第一个字符)并且您必须为其提供一个 char*
。所以你应该传递 str
.
我认为你的代码应该像
int* Read_file(char str[])
{
FILE* fp = fopen(str, "r");
if(fp == NULL)
{
printf("File cannot open\n");
return NULL;
}
int rows = 0;
while(!feof(fp))
{
if(fgetc(fp) == '\n')
{
rows ++;
}
}
rows ++;
int* keys = (int*)malloc(3 * rows * sizeof(int));
fseek(fp, 0L, 0);
while(!feof(fp))
{
for(int i = 0;i < rows;i ++)
{
for(int j = 0;j < 3;j ++)
{
fscanf(fp,"%d", &keys[(3 * i) + j]);
}
}
}
fclose(fp);
return keys;
}
int main()
{
char str[20];
printf("Build_tree ");
scanf("%s",str);
int* keys = Read_file(str);
//Whatever you want to do with the keys
return 0;
}
对任何问题发表评论。