在 xcode 6 中用 c 编程打开文件

Opening a file in c programming in xcode 6

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int ch; //place to store each character as read
    FILE *fp;
    unsigned long count = 0;
    if (argc != 2)
    {
        printf("Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if ((fp = fopen(argv[1], "r")) == NULL) 
    { 
        printf("Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE); 
    }

    while ((ch = getc(fp)) != EOF) 
    {
        putc(ch,stdout); // same as putchar(ch);
        count++; 
    }
    fclose(fp);
    printf("File %s has %lu characters\n", argv[1], count);

    return 0;
}

运行该程序的结果是:

Usage: /Users/huangweijun/Library/Developer/Xcode/DerivedData/input-hhjvfzwnywskidbyoxavtgvmoffb/Build/Products/Debug/input filename

不知道哪一步错了

您没有提供足够的命令行参数。要在 xcode 中提供输入文件,您可以转到 产品菜单 -> 方案 -> 编辑方案 选项....此时您可以传入路径到您希望用作输入的文件

您的程序运行正常。您没有提供命令行参数,它告诉您如此

在 xcode 中添加参数的屏幕如下所示。您进入此屏幕,使用上述菜单选项,单击加号按钮,然后将路径添加到输入文件

没什么问题。阅读代码,尤其是这部分:

if (argc != 2)
{
    printf("Usage: %s filename\n", argv[0]);
    exit(EXIT_FAILURE);
}

如果命令行参数个数不等于2,打印出一些使用信息然后退出。所以你需要用一个命令行参数调用程序。

请注意,虽然它与值 2 进行比较,但程序只需要一个参数,因为程序名称本身算作第一个参数,即 argv[0].

问题是您需要在调用时将 exaclty 1 参数传递给您的程序,要在 XCode 中实现这一点,您需要转到这些菜单

Product -> Edit Scheme... -> Run -> Arguments

在那里您会看到Arguments Passed On Launch 单击plus 标志,然后添加一个文件名,即您要打开的文件的路径。

或者您可以向用户询问这样的文件名

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int ch; //place to store each character as read
    FILE *fp;
    unsigned long count = 0;
    const char *filename;
    char buffer[128];

    filename = NULL;
    if (argc != 2)
    {
        size_t length;
        printf("Enter the file name > ");
        if (fgets(buffer, sizeof(buffer), stdin) == NULL)
            return -1; // error or end of file sent to the terminal
        length = strlen(buffer);
        if (buffer[length - 1] == '\n') // remove the traling '\n' add by fgets
            buffer[length - 1] = '[=11=]';
        filename = buffer;
    }
    else
        filename = argv[1];

    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf("Can't open %s\n", filename);
        exit(EXIT_FAILURE);
    }

    while ((ch = getc(fp)) != EOF)
    {
        putc(ch,stdout); // same as putchar(ch);
        count++;
    }
    fclose(fp);
    printf("File %s has %lu characters\n", filename, count);

    return 0;
}

产品 -> 编辑方案... -> 运行 -> 参数 在"Arguments Passed On Launch"点击加号,然后添加一个绝对文件名,即你要打开的文件的路径。

***如果您的文件夹名称在您的绝对路径中有空格,这将不起作用!。因此打开终端,将文件拖放到终端 window 中,然后复制绝对路径(当然是从终端 window 复制)并将其粘贴到 "Arguments Passed On Launch" 部分(如上所述) .