无法将完整的字符串写入文件

时间:2014-05-21 13:16:27

标签: c string file loops

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

#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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:0)

我认为问题出在这一行:

while(fscanf(pokDatTestna,“%100 [^ \ n]%* c”,linija)&gt; = 0)

将其替换为:

while(fscanf(pokDatTestna,“%100 [^ \ n]%s”,linija)&gt; = 0)