Faylga noto'g'ri yozish kerakmi?

Shuning uchun men faylni ochaman, key.txt faylini chaqiraman

    FILE *fp;
    fp = fopen("key.txt", "r");

Endi menda "a" kodi bilan ochilgan yana bir fayl (fa) borligini aytishim mumkin. Keling, fp-dan barcha belgilarni o'qib, har bir alfavitik belgini fp-faylga qo'shib qo'ying, ammo u bundan kattaroqdir.

    char c;
    do {
        c = getc(fp);
        if(isalpha(c)){
            fprintf(fa, &c);
            fprintf(fa, "\n");
        }
     } while(c != EOF);

OK, bu men uchun yaxshi ko'rinadi, endi u har bir alfavit belgini faylga qo'shadi, lekin bu muammo bitta matnli qatorga ham ko'proq belgilariga qo'shiladi. Men bu masalani aniq belgilashga harakat qilyapman. Mana key.txt ichida namuna

    lol
    xd

Chiqish faylining mazmuni bor

    l<82>^0)y^?
    o<82>^0)y^?
    l<82>^0)y^?
    x<82>^0)y^?
    d<82>^0)y^?

Xo'sh, bu erda nima bo'layotganini bilmayman. Buni qanday tuzataman? Men aniq masala nima ekanligini bilmayman

1
Ha, u [yana qayta ko'rib chiqilgandan keyin qayta tekshirilgandir] tuzadi, shuning uchun birinchi izohimni o'chirib tashladim. & c [texnik jihatdan so'zlashadigan] char * bo'lishi va derleyici ichida format brauzer tomonidan qabul qilinishi mumkin. char fmt [2] ga mos kelmasligini tushunib etolmaydi va uni belgilang
qo'shib qo'ydi muallif Craig Estey, manba
Ha, u [yana qayta ko'rib chiqilgandan keyin qayta tekshirilgandir] tuzadi, shuning uchun birinchi izohimni o'chirib tashladim. & c [texnik jihatdan so'zlashadigan] char * bo'lishi va derleyici ichida format brauzer tomonidan qabul qilinishi mumkin. char fmt [2] ga mos kelmasligini tushunib etolmaydi va uni belgilang
qo'shib qo'ydi muallif Craig Estey, manba
fprintf (fa, & c); -> fprintf (fa, "% c", v); ?
qo'shib qo'ydi muallif Sourav Ghosh, manba
fprintf() chaqirganda parametrlarning manzilini emas, balki parametrlarning mazmunini o'tkazing.
qo'shib qo'ydi muallif user3629249, manba
fprintf() chaqirganda parametrlarning manzilini emas, balki parametrlarning mazmunini o'tkazing.
qo'shib qo'ydi muallif user3629249, manba
fprintf() chaqirganda parametrlarning manzilini emas, balki parametrlarning mazmunini o'tkazing.
qo'shib qo'ydi muallif user3629249, manba
Rahmat qilgan @SouravGhosh! Kreyg Estey, men "Vall" bilan derdim va u juda yaxshi ishladi
qo'shib qo'ydi muallif reVolutionary, manba
Rahmat qilgan @SouravGhosh! Kreyg Estey, men "Vall" bilan derdim va u juda yaxshi ishladi
qo'shib qo'ydi muallif reVolutionary, manba

6 javoblar

Siz fprintf() kodini noto'g'ri ishlatasiz. odam sahifasida , kutilgan format

int fprintf(FILE *stream, const char *format, ...);

bu erda birinchi argument fayl belgisi, ikkinchisi konkretlashtiruvchi va uchinchidan, yuqorida ko'rsatilgan ayirma belgisi uchun argument (lar) dir.

C11 , paragraf §7.21.6.1, fprintf() kodlash, format specifier uchun

c

     

Agar l uzunligi o'zgaruvchisi bo'lmasa int argumenti    unsigned char va natijada paydo bo'lgan belgilar yoziladi. [...]

Shunday qilib, agar siz bir belgi yozishni istasangiz, siz kabi bir narsani ishlatishingiz kerak

fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable

Buning uchun getc() kodini int qaytaradi, shuning uchun siz int o'zgaruvchisida qaytish qiymatini olishingiz kerak.

Moral of the story: Enable compiler warnings.

5
qo'shib qo'ydi

Siz fprintf() kodini noto'g'ri ishlatasiz. odam sahifasida , kutilgan format

int fprintf(FILE *stream, const char *format, ...);

bu erda birinchi argument fayl belgisi, ikkinchisi konkretlashtiruvchi va uchinchidan, yuqorida ko'rsatilgan ayirma belgisi uchun argument (lar) dir.

C11 , paragraf §7.21.6.1, fprintf() kodlash, format specifier uchun

c

     

Agar l uzunligi o'zgaruvchisi bo'lmasa int argumenti    unsigned char va natijada paydo bo'lgan belgilar yoziladi. [...]

Shunday qilib, agar siz bir belgi yozishni istasangiz, siz kabi bir narsani ishlatishingiz kerak

fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable

Buning uchun getc() kodini int qaytaradi, shuning uchun siz int o'zgaruvchisida qaytish qiymatini olishingiz kerak.

Moral of the story: Enable compiler warnings.

5
qo'shib qo'ydi

Siz fprintf() kodini noto'g'ri ishlatasiz. odam sahifasida , kutilgan format

int fprintf(FILE *stream, const char *format, ...);

bu erda birinchi argument fayl belgisi, ikkinchisi konkretlashtiruvchi va uchinchidan, yuqorida ko'rsatilgan ayirma belgisi uchun argument (lar) dir.

C11 , paragraf §7.21.6.1, fprintf() kodlash, format specifier uchun

c

     

Agar l uzunligi o'zgaruvchisi bo'lmasa int argumenti    unsigned char va natijada paydo bo'lgan belgilar yoziladi. [...]

Shunday qilib, agar siz bir belgi yozishni istasangiz, siz kabi bir narsani ishlatishingiz kerak

fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable

Buning uchun getc() kodini int qaytaradi, shuning uchun siz int o'zgaruvchisida qaytish qiymatini olishingiz kerak.

Moral of the story: Enable compiler warnings.

5
qo'shib qo'ydi

Sizning kod qismingiz bir nechta muammolarga ega:

char c;
do {
    c = getc(fp);
    if(isalpha(c)){
        fprintf(fa, &c);
        fprintf(fa, "\n");
    }
 } while(c != EOF);
  • c should be declared with the int type to accommodate for all values of type unsigned char plus the special negative value EOF.

  • fprintf must be passed a format string. fprintf(fa, &c); has undefined behavior. Use fprintf(fa, "%c", c); or simply putc(c, fa);. undefined behavior means anything can happen: gibberish output is one possibility, a program crash is another...

  • check for EOF before further processing in the loop. The do { ... } while loop is not appropriate, use while ((c = getc(fp)) != EOF) { ... } instead.

Mana tuzatilgan versiya:

int c;
while ((c = getc(fp)) != EOF) {
    if (isalpha(c)) {
        fprintf(fa, "%c\n", c);
    }
 }
1
qo'shib qo'ydi

Sizning kod qismingiz bir nechta muammolarga ega:

char c;
do {
    c = getc(fp);
    if(isalpha(c)){
        fprintf(fa, &c);
        fprintf(fa, "\n");
    }
 } while(c != EOF);
  • c should be declared with the int type to accommodate for all values of type unsigned char plus the special negative value EOF.

  • fprintf must be passed a format string. fprintf(fa, &c); has undefined behavior. Use fprintf(fa, "%c", c); or simply putc(c, fa);. undefined behavior means anything can happen: gibberish output is one possibility, a program crash is another...

  • check for EOF before further processing in the loop. The do { ... } while loop is not appropriate, use while ((c = getc(fp)) != EOF) { ... } instead.

Mana tuzatilgan versiya:

int c;
while ((c = getc(fp)) != EOF) {
    if (isalpha(c)) {
        fprintf(fa, "%c\n", c);
    }
 }
1
qo'shib qo'ydi

Sizning kod qismingiz bir nechta muammolarga ega:

char c;
do {
    c = getc(fp);
    if(isalpha(c)){
        fprintf(fa, &c);
        fprintf(fa, "\n");
    }
 } while(c != EOF);
  • c should be declared with the int type to accommodate for all values of type unsigned char plus the special negative value EOF.

  • fprintf must be passed a format string. fprintf(fa, &c); has undefined behavior. Use fprintf(fa, "%c", c); or simply putc(c, fa);. undefined behavior means anything can happen: gibberish output is one possibility, a program crash is another...

  • check for EOF before further processing in the loop. The do { ... } while loop is not appropriate, use while ((c = getc(fp)) != EOF) { ... } instead.

Mana tuzatilgan versiya:

int c;
while ((c = getc(fp)) != EOF) {
    if (isalpha(c)) {
        fprintf(fa, "%c\n", c);
    }
 }
1
qo'shib qo'ydi