【问题标题】:Printing char to file gives weird result将字符打印到文件会产生奇怪的结果
【发布时间】:2016-06-15 20:16:07
【问题描述】:

所以我将字符打印到文件中,每当行结束时,它都会做一些奇怪的事情。

这是我使用的代码:

void opdracht43() {
    FILE *file;
    FILE *file2;
    file = fopen("opdracht1.1.cpp", "r");
    file2 = fopen("Disc.c", "w");
    int p;
    char a[100];
    while (fgets(a, 100, file)) {
        for (int i = 0; i < sizeof a; i++) {
            if (a[i] == '\n' || a[i] == ' ' || a[i] == '\t') {
                printf("TRUE");
            }
            else {
                printf("FALSE");
                fputc(a[i], file2);
            }
        }
        return 0; //So it only prints the 1st line for now.
    }
    fclose(file);
    fclose(file2);
}

当它运行时,这是它给出的文本:

#include<stdio.h> ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ

> 和 Ì 之间的空格在记事本++中给了我一个奇怪的黑色 nul

文件的第一行是:

#include<stdio.h>

我希望我能在这里找到一些帮助:)

【问题讨论】:

  • 您总是试图输出 100 个字节(跳过空格)。但是你应该在输入中遇到\0 时跳出for 循环,因为这标志着fgets 读取内容的结束。否则,您将输出过去的有效输入,因此会产生垃圾结果。
  • 扩展@kaylum评论,i &lt; sizeof a应该是i &lt; sizeof(a) &amp;&amp; a[i]
  • for (int i = 0; i &lt; sizeof a; i++) { --> for (size_t i = 0; a[i]; i++) {
  • "奇怪的黑色 nul" 就像 '\0' 字符

标签: c file io char file-writing


【解决方案1】:

改变

for (int i = 0; i < sizeof a; i++) {

到

for (int i = 0; a[i] != '\0' && i < sizeof a; i++) {

在你的情况下,在fgets() 的第一次调用中,数组a 给出了这些值:'#'、'i'、'n'、'c'、...、'o'、'.' , 'h', '>' 和一个 '\0'。但是,a 的其余部分仍然包含像 Ì 这样的垃圾,因为 a 从未初始化。

'\0' 只是你提到的“奇怪的黑色 nul”。 '\0' 是 C 风格字符串结尾的信号,但它不代表文件的结尾,因此不应使用fputc() 将其写入“Disc.c”

【讨论】:

    【解决方案2】:

    sizeof a 是变量a 的大小(以字节为单位),始终为 100。您希望使用a 中保存的字符串长度(即strlen(a))来限制循环。

    此外,您不应逐个字符地写入文件流。这不是文件 I/O 的设计方式。

    【讨论】:

    • 一次写入一个字符并不是真正的问题,因为它正在被缓冲(并且正在过滤输出以删除一些字符)。将过滤后的序列存储在另一个缓冲区中没有任何好处(您暗示会更好)。
    • C 中的流实际上被设计为一次写入或读取一个字符。 fgetc 和 fputc 是原语,您会发现其他流函数是通过调用单字符原语来实现的(或者您曾经这样做过)
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2015-08-18
    • 2015-10-04
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多