【问题标题】:Printing a string from a file that was read using fread() is not working properly从使用 fread() 读取的文件中打印字符串无法正常工作
【发布时间】:2021-01-19 03:18:54
【问题描述】:

我是 C 语言的初学者,我正在尝试使用 fread()fwrite() 等函数来学习文件处理,但是有一个当我从文件中读取字符串并使用printf("%s", var); 输出它时出现问题,这是下面用于测试功能的程序。

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

void main()
{
    FILE *farquivo;
    int i;
    char text[10];
    char file[51] = "string01  string02  string03  string04  string05  ";

    farquivo = fopen("dados.txt", "w");
    fwrite(file, 1, sizeof(file), farquivo);
    fclose(farquivo);

    farquivo = fopen("dados.txt", "r");
    printf("Sizeof text[] = %d\n", sizeof(text));
    printf("Strings by %%s:\n");
    fread(text, 1, sizeof(text), farquivo);
    printf("%s\n", text);
    fread(text, 1, sizeof(text), farquivo);
    printf("%s\n", text);
    fread(text, 1, sizeof(text), farquivo);
    printf("%s\n", text);
    fread(text, 1, sizeof(text), farquivo);
    printf("%s\n", text);
    fread(text, 1, sizeof(text), farquivo);
    printf("%s\n", text);
    printf("String char by char:\n");
    for(i = 0; i < sizeof(text); i++){
        printf("%c", text[i]);
    }
    printf("\n");
    fclose(farquivo);
}

一切似乎都还好,但输出很奇怪,这是控制台上的输出:

Sizeof text[] = 10
Strings by %s:
string01  `FÛu>
string02  `FÛu>
string03  `FÛu>
string04  `FÛu>
string05  `FÛu>
String char by char:
string05

Process returned 0 (0x0)   execution time : 0.051 s
Press any key to continue.

由于某种原因,当我使用printf("%s", var); 打印字符串时,它的末尾会输出“`FÛu>”,但是如果我一个一个打印字符串的每个字符,这不会发生,我是否在对吗?

【问题讨论】:

  • fread() 没有在末尾添加 0 字节,使 text 不是有效的 C 字符串。
  • C 中的字符串是 nul 终止的。您读取字符串的方法不会在字符串末尾放置一个 nul 字符,因此当您将它们打印出来时,您会在字符串之后得到垃圾。
  • 如果你使用fwrite而不是printf,你不需要有一个以空结尾的字符串。例如,将printfs 替换为fwrite(text, 1, sizeof text, stdout)
  • 虽然 C 中的所有字符串都存在于 char 数组中并且可以这样处理,但 char 数组不一定包含字符串,如果您将其视为字符串而不是字符串,则会得到 undefined行为。

标签: c file output file-handling fread


【解决方案1】:

当您看到这样的怪异时,可能意味着您正在访问未分配的内存或未初始化的内存。在你的情况下,你的字符串不是空终止的。

当你打印一个字符串时,它会输出字符,直到它到达内存中的第一个 NULL(即 zer0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多