C语言 “没有这样的文件或目录”,但我在目录中的文件

toiithl6  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(159)

我试图解决这个问题的CS50,但由于一些令人费解的原因,它甚至不会承认,我试图运行的文件,甚至存在时,我在正确的目录与上述文件。


的数据

#include <stdio.h>

int main(int argc, char *argv[])
{
    // Check for command line args
    if (argc != 2)
    {
        printf("Usage: ./read infile\n");
        return 1;
    }

    // Create buffer to read into
    char buffer[7];

    // Create array to store plate numbers
    char *plates[8];

    FILE *infile = fopen(argv[1], "r");

    int idx = 0;

    while (fread(buffer, 1, 7, infile) == 7)
    {
        // Replace '\n' with '\0'
        buffer[6] = '\0';

        // Save plate number in array
        plates[idx] = buffer;
        idx++;
    }

    for (int i = 0; i < 8; i++)
    {
        printf("%s\n", plates[i]);
    }
}

字符串

5tmbdcev

5tmbdcev1#

license.c是一个 * 源 * 文件,必须 * 编译 * 为 * 可执行 * 文件。licenselicense.c不同。
用于将源文件转换为可执行文件的CS50工具称为make。例如,执行make foo将导致程序查找名为foo.c的源文件,并生成名为foo的可执行文件,假设在编译(或链接)期间没有错误发生。
这在Week 1 Lecture和其他各种地方(如Debug)中进行了描述。
总之,按顺序键入以下命令。

$ make license
$ ./license

字符串
$表示您正在将这些命令键入终端。
关于你的节目:

  • infile应测试为不是NULL。如果是NULL,程序应该提前退出,否则fread将调用Undefined Behaviour
  • plates[idx] = buffer;中,buffer衰减为指向其第一个元素的指针,该指针值存储在plates数组中。不存在缓冲区元素的复制或发生的自动存储器分配。实际上,您在plates中重复存储对相同数组的引用。
  • 您应该以某种方式分配内存来存储您读取的每个板。或者使用动态内存分配,或者使用 * 二维 * 数组(例如char plates[8][7];)。对于前者,您需要将当前缓冲区的值(strcpy/memcpy)复制到新的内存分配中,而对于后者,您可以直接读取plates
  • while循环还应该在从文件阅读更多数据之前检查plates是否未满。否则,当idx大于或等于(>=)到8时,您将通过在出界位置访问plates来调用更多的Undefined Behaviour
bvpmtnay

bvpmtnay2#

使用以下命令将源文件编译为文件名为 license 的二进制文件。

gcc license.c –o license

字符串
o标志允许您指定输出文件名。如果不使用-o标志,将生成一个名为 a.out 的输出文件。
现在可以使用./license来执行代码。

相关问题