我有一个名为test.txt的文本文件

我想写一个C程序,可以读取这个文件并将内容打印到控制台(假设文件只包含ASCII文本).

我不知道如何获取字符串变量的大小.这样地:

char str[999];
FILE * file;
file = fopen( "test.txt" , "r");
if (file) {
    while (fscanf(file, "%s", str)!=EOF)
        printf("%s",str);
    fclose(file);
}

大小为999的字符串不起作用,因为fscanf返回的字符串可能大于999.我该怎么解决这个问题?

推荐答案

最简单的方法是读取字符,并在读取后立即打印:

int c;
FILE *file;
file = fopen("test.txt", "r");
if (file) {
    while ((c = getc(file)) != EOF)
        putchar(c);
    fclose(file);
}

c在上面是int,因为EOF是负数,普通char可以是unsigned.

如果您想分块读取文件,但不需要动态内存分配,可以执行以下操作:

#define CHUNK 1024 /* read 1024 bytes at a time */
char buf[CHUNK];
FILE *file;
size_t nread;

file = fopen("test.txt", "r");
if (file) {
    while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
        fwrite(buf, 1, nread, stdout);
    if (ferror(file)) {
        /* deal with error */
    }
    fclose(file);
}

上面的第二种方法实质上就是如何读取具有动态分配的数组的文件:

char *buf = malloc(chunk);

if (buf == NULL) {
    /* deal with malloc() failure */
}

/* otherwise do this.  Note 'chunk' instead of 'sizeof buf' */
while ((nread = fread(buf, 1, chunk, file)) > 0) {
    /* as above */
}

%s作为格式的方法会丢失有关文件中空白的信息,因此它并不完全是将文件复制到stdout.

C++相关问答推荐

当办公室阻止Visual Studio时编码和编译C

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

为什么下面的C代码会进入无限循环?

为什么在此程序中必须使用Volatile关键字?

当我更改编译优化时,相同的C代码以不同的方式运行

当输入负数时,排序算法存在问题

判断X宏的空性

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

这个计算C中阶乘的函数正确吗?

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

这个空指针类型的转换是有效代码还是恶意代码?

无法识别C编程语言的语法,如书中所示

如何在MSVC中使用intSafe.h函数?

分配给静态变量和动态变量的位置之间有区别吗?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

C 语言中 CORDIC 对数的问题

clion.我无法理解 Clion 中发生的 scanf 错误

OpenGL 中的非渐变 colored颜色 变化