c - 从C中的多个文件中读取字符

标签 c file file-io stdin

我正在尝试读取不同文件中的所有字符。例如,通过调用 myprogram < file1 file2 .

我的方法如下:

void do_read(FILE * file){
char ch;

    while (ch != EOF) {
        ch = getc(file);


        printf("%c\n", ch);
}

int main(int argc, char * argv[])
{
    int i = 1;
    FILE * fp = NULL;

    if (argc < 1) {
        //Error. No file given
printf("Error");
    }
    else {
        // cycle through all files in command line arguments and read them
        for (i=1; i < argc; i++) {
            if ((fp = fopen(argv[i], "r")) == NULL) {
                printf("Failed to open file.\n");
            }
            else {
                do_read(fp);
                fclose(fp);
            }
        }
    }

    return 0;
}

但是每当我尝试运行它时,即使是 myprogram < file1 (只有 1 个参数)它不输出任何内容。甚至连printf("Error")都没有.

有人可以帮我修复我的代码吗?我究竟做错了什么?有更好的方法吗?

非常感谢您提前提供的帮助!

最佳答案

myprogram < file1本质上是 cat file1 | myprogram 的简写,也就是说,您的程序需要读取 stdin 来获取该文件的内容。您想要的调用是 myprogram file1 file2 .

此外,您的 do_read 函数已损坏,因为它甚至会在字符 EOF 时打印该字符。 。不要在获取之前检查,而是在获取时检查:

void do_read(FILE * file){
    char ch = '\0';

    while (ch != EOF) {
        ch = getc(file);
        printf("%c\n", ch);
    }
}
/* Becomes: */
void do_read(FILE * file){
    char ch = '\0';

    while ((ch = getc(file)) != EOF) {
        printf("%c\n", ch);
    }
}

关于c - 从C中的多个文件中读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30039680/

相关文章:

file-io - 在 Kotlin 中使用 BiPredicate 的 Files.find()

c++ - 正确地将 B 转换为 MB,或者完全错误

c++ - file.is_open() 和 file.fail() 的区别

c - 以二进制模式将位/字节转储到文件

在写入文件之前检查文件是否存在,然后要求用 POSIX 在 C 中覆盖

c - 我需要从文件中读取数据,但无法从中读取全部值

c - 字符串排列 - 这种回溯递归是如何工作的?

c - 尝试使用泰勒公式生成 cos x 的值

c - 动态分配和复制数组

file - 多个文件中的单个 fortran 模块