В настоящее время я изучаю главу 13 из книги C Primer Plus (6-е издание) Prata, листинг 13.2 на странице 574, реализованный в кодовых блоках с использованием gcc. Код показан ниже. У меня есть текстовый файл с именем eddy.txt (но Win10 не показывает окончание .txt, поэтому показывает только eddy). Программа использует этот текстовый файл в качестве аргумента через argc/argv[], считывает строку и сохраняет измененную версию в новый файл с именем eddy.red.
Просматривая объяснение книги, новый текстовый файл должен называться «eddy.red». Однако новый текстовый файл на моей машине называется «eddy.txt.red».
Есть ли у кого-нибудь из вас объяснение, почему существует разница между моим выводом и примером из книги? Это зависит от машины/компилятора? Похоже, что «.txt» исходного файла eddy.txt попал в имя строки, поэтому при создании вывода новый файл будет называться «eddy.txt»+».red» = «eddy.txt». .красный". Это немного прискорбно, потому что было бы здорово, если бы новый файл был напрямую сохранен как файл .txt, что было бы в том случае, если бы я просто выбрал имя для нового файла, например. "Алекс": fopen("Alex.txt","w") вместо fopen(имя, "w").
Спасибо,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define LEN 50
/*
From C Primer Plus. Listing 13.2
*/
int main(int argc, char * argv[])
{
FILE *in;
FILE *out;
int ch;
char name[LEN];
int count = 0;
if(argc < 2)
{
fprintf(stderr, "Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
if((in=fopen(argv[1],"r"))==NULL)
{
fprintf(stderr,"Couldn't open the file \"%s\"\n",argv[1]);
exit(EXIT_FAILURE);
}
strncpy(name,argv[1],LEN-5);
name[LEN-5] = '\0';
strcat(name,".red");
if((out=fopen(name,"w"))==NULL)
{
fprintf(stderr,"Cannot create output file\n");
exit(EXIT_FAILURE);
}
// copy data
while((ch=getc(in))!=EOF)
{
if(count++ % 3 == 0)
{
putc(ch, out);
}
}
if(fclose(in)!=0 || fclose(out)!=0)
{
fprintf(stderr,"Error in closing files\n");
}
return 0;
}
eddy
илиeddy.txt
? Похоже, вы сказалиeddy.txt
, и когда это было скопировано вname
и добавлено расширение.red
, вы получитеeddy.txt.red
, как и ожидалось. Если бы вы сказали простоeddy
, я бы ожидал, что вы не сможете открыть ни один файл (если у вас есть файлeddy
без суффикса). - person Jonathan Leffler   schedule 12.04.2020