【问题标题】:Cannot write full string to file无法将完整字符串写入文件
【发布时间】:2014-05-21 13:16:27
【问题描述】:

我需要我的程序将整个字符串附加到我的文件中。我的代码如下所示:

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

int main()
{
    char nazivDatoteke[128];
    printf("Unesite naziv datoteke koja ce se kreirati: ");
    scanf("%123s",nazivDatoteke);

    FILE *pokDatTestna = NULL;
    FILE *pokDatZavrsna = NULL;
    char nazDatZavrsna[] = "zavrsna.txt";
    char linija[100+1];
    char tekst[128];
    pokDatTestna = fopen(nazivDatoteke, "a");
    pokDatZavrsna = fopen(nazDatZavrsna, "a");

    if(pokDatTestna == NULL || pokDatZavrsna == NULL)
    {
        printf("Datoteke nije moguce otvoriti!");
        exit(EXIT_FAILURE);
    }

    do{
    printf("Unesite recenicu koja ce se upisati u datoteku: ");
    scanf("%s", tekst);
    if (strcmp("KRAJ",tekst) != 0){
        fprintf(pokDatTestna, "%s\n", tekst);
        }
    }while(strcmp("KRAJ",tekst) != 0);

    fclose(pokDatTestna);

    pokDatTestna = fopen(nazivDatoteke, "r");

    while(fscanf(pokDatTestna, "%100[^\n]%*c", linija) >= 0)
    {
        fprintf(pokDatZavrsna, "%s\n", linija);
    }

    fclose(pokDatTestna);
    fclose(pokDatZavrsna);

    return 0;
}

这有效,但不适用于附加完整字符串。它分别附加它们。所以如果我输入“this is a test sentence”,文件会显示:

this
is
a
test
sentence

当我尝试在 scanf 中使用 fgets 或 "%[^\n]" 时,它陷入了无限循环并在文件中附加了空格。我不知道我做错了什么,因为它适用于 scanf,但是一旦我使用一种直到换行才停止扫描的方法,程序就会表现得很奇怪。

【问题讨论】:

  • 不要使用scanf,使用fgets
  • 我试过了,但对我的情况没有帮助。
  • 你一定是在滥用fgets。在其他地方,here 是正确使用的一个例子。
  • 哪个文件有问题?

标签: c string file loops


【解决方案1】:

如果您想阅读整行文本,请不要将scanf()%s 一起使用。这适用于以空格分隔的字符串。

使用fgets(),并检查返回值,I/O会失败:

while(fgets(tekst, sizeof tekst, stdin) != NULL &&
      strncmp(tekst, "KRAJ\n", 5) != 0)
{
}

【讨论】:

  • fgets检查返回值是不够的。
  • 你没看我说的吗? fgets 在不接受输入的情况下跳过并在我的程序中导致无限循环并将​​空格无限期地写入文件。
  • @VengeanceIsMine fgets() 不会那样做。如果是这样,要么您的 libc 充满错误(不太可能),要么您在其他地方犯了另一个错误(可能),不了解各个 I/O 函数的作用以及它们如何工作(可能)或者您没有告诉我们完整的故事。
  • 是的,我有点滥用它。谢谢
【解决方案2】:

这是一个常见问题。当你这样做

scanf("%123s",nazivDatoteke);
/* ... */
do {
    scanf("%[^\n]", tekst);
    /* ... */
} while (...);

您将字符串读入nazivDatoteke,但输入缓冲区中仍有换行符。当你尝试scanf("%[^\n]") 时,你会得到一个空行,因为这个换行符。

您可以通过先跳过空格来避免这种情况。这可以通过在格式字符串前加上空格来完成

    scanf(" %[^\n]", tekst);

现在scanf 读取剩余的空格和任何前导空格,然后将该行的其余部分消耗到tekst

【讨论】:

    【解决方案3】:

    我认为问题出在这一行:

    while(fscanf(pokDatTestna, "%100[^\n]%*c", linija) >= 0)

    替换为:

    while(fscanf(pokDatTestna, "%100[^\n]%s", linija) >= 0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2011-10-24
      相关资源
      最近更新 更多