需要帮助从C中的文件中读取

时间:2014-09-12 15:52:24

标签: c arrays file-io

我一直在寻找解决方案,但似乎无法找到我的问题的解决方案,所以我会问它。我正在使用C语言并且正在读取.txt并获取所有值并将它们存储在一个数组中,然后使用它们执行各种任务。现在我的问题是,无论我做什么,我都无法获取我创建的文件指针,因为某些原因指向该文件。我已经为过去的项目完成了这项工作,并将我的代码与当前的代码进行了比较,但无法看到问题。文件名也需要从命令行读入。我认为我通过命令行传输的内容有些不对,但我不确定。我已经介入并且文件名正确传递但是当它尝试打开时我得到一个空指针,所以我只缺少一些东西。

文本文件将包含一系列数字,第一个数字将是第一个数字后文件中的数字。 (因此,如果数字为10,则在读入10之后将有10个数字)在第一个数字之后,其余数字将以随机顺序为0-9。

下面是我目前的代码块,仅涉及读取文件并存储其数据。 (我已经知道数组的大小为10,这就是为什么用这个大小声明数组的原因。)

int main(int argc, char *argv[])
{
 char* filename = "numbers.txt";
 int arr[10];
 int numElem;
 int indexDesired = 0;

FILE *fp;
fp = fopen(filename, "r"); // open file begin reading
if (!fp) 
{
    printf("The required file parameter name is missing\n");
    system("pause");
    exit(EXIT_FAILURE);
}
else
{
    fscanf(fp, "%d", &numElem); //scans for the first value which will tell the number of values to be stored in the array

    int i = 0;
    int num;
    while (i <= numElem) //scans through and gets the all the values and stores them in the array.
    {
        fscanf(fp, "%d", &num);
        arr[i] = num;
        i++;
    }
    fclose(fp);
 }
}

***注意:我的排序和交换方法完美无缺,所以我在代码中省略了它们,因为错误发生在它们被调用之前。

2 个答案:

答案 0 :(得分:2)

你说,

  

还需要从命令行读取文件名。

但是,您正在使用:

char* filename = "numbers.txt";

fp = fopen(filename, "r"); // open file begin reading

无论您在命令行中传递什么,您尝试打开的文件都是"numbers.txt"

要尝试的事情:

  1. 使用"numbers.txt"的完整路径名,而不仅仅是文件名。

    char* filename = "C:\\My\\Full\\Path\\numbers.txt";
    

    如果这不起作用,您可能需要处理权限问题。

  2. 使用完整路径从命令行传递文件名。如果没有权限问题,这应该有效。

    if ( argc < 2 )
    {
        // Deal with unspecified file name.
    }
    char* filename = argv[1];
    
  3. 传递文件名的相对路径。如果从Visual Studio测试程序,则必须确保使用相对于Visual Studio启动程序的目录的路径。

答案 1 :(得分:0)

  while (i <= numElem)

应该是

   while (i < numElem)

因为在fscanf(fp, "%d", &numElem);中您正在扫描元素的数量。

请注意,C中的数组从0开始,所以如果说numElem 10 arr[10]不存在,那可能是有害的,因为arr从arr[0]转到{ {1}}

此外,您应该在arr[9]循环之前检查numElem是否低于10。