2015-06-21 4 views
-1

Я хочу, чтобы открыть файл, используя аргументы при выполнении его, например:Аргументы открыть файл

./Project 123.txt 

я могу сделать эту работу в какой-то степени, но если я стараюсь передать аргументы в функцию , а затем вызвать функцию, что-то не работает совершенно правильно.

Вот функция, у меня есть, которая будет читать строки из текстового файла:

int numeroLinhas(){ 
    int ch; 
    FILE *fp; 
    int linhas=0; 
    fp = fopen("123.txt","r"); 
    while((ch = fgetc(fp)) != EOF){ 
     if(ch=='\n'){ 
      linhas++; 
     } 
    } 

    fclose(fp); 
    fprintf(stats, "linhas: %d\n", linhas); 
} 

int main(int argc, char *argv[]){ 
    FILE *fp; 
    fp = fopen(argv[1],"r"); 
    numeroLinhas(); 
} 

Итак, я хотел бы знать, как я могу передать argv[] имеет аргумент в мою numeroLinhas() функцию, так что мне не нужно называть имя файла вообще во время кодирования, как раз при выполнении.

+0

Что говорит ваш учебник о «аргументах, передаваемых функции»? –

+1

Две вещи: Firs - это то, что ['fgetc'] (http://en.cppreference.com/w/c/io/fgetc) возвращает *' int' *. Во-вторых, уже существует функция для чтения строк: ['fgets'] (http://en.cppreference.com/w/c/io/fgets). –

+0

yes true, я изменил char ch на int. Да, мне известно о fgets, но я должен использовать fgetc –

ответ

1

Передайте имя файла в функцию, которая подсчитывает строки в файле:

#include <stdio.h> 

void numeroLinhas(const char *filename) 
{ 
    int ch; 
    int linhas = 0; 
    FILE *fp = fopen(filename, "r"); 
    if (fp == 0) 
    { 
     fprintf(stderr, "Failed to open file %s for reading\n", filename); 
     return; 
    } 
    while ((ch = fgetc(fp)) != EOF) 
    { 
     if (ch == '\n') 
      linhas++; 
    } 

    fclose(fp); 
    fprintf(stats, "linhas: %d no %s\n", linhas, filename); 
} 

int main (int argc, char *argv[]) 
{ 
    for (int i = 1; i < argc; i++) 
     numeroLinhas(argv[i]); 
    return 0; 
} 

проверки ошибок fopen() вызовов; они терпят неудачу. Обращайтесь с правилом int, возвращенным fgetc(). Измените функцию, чтобы вернуть void, так как нет возврата. Сообщить об ошибках стандартной ошибки. Включить имя файла в выходы (ошибка и рутина). Вызовите функцию по всем предоставленным аргументам. Не говорите ничего, если аргументы отсутствуют, или добавьте if (argc < 2) { fprintf(stderr, "Usage: %s file [...]\n", argv[0]); return 1; } перед циклом в main().

Извините за смешанные сообщения на английском и португальском языках.

3

Проблема в том, что у вас есть жестко закодированное имя файла для открытия. Измените свою функцию, чтобы принять аргумент, строку, называя файл.

Затем просто передайте правильную запись argv в качестве аргумента функции после проверки количества аргументов в программе в первую очередь.

1
int numeroLinhas(char *filename){ 
    char ch; 
    FILE *fp; 
    int linhas=0; 
    fp = fopen(filename,"r"); 
    while((ch = fgetc(fp)) != EOF){ 

     if(ch=='\n'){ 
     linhas++; 
     } 
    } 

    fclose(fp); 
    fprintf(stats, "linhas: %d\n", linhas); 
} 

int main (int argc, char *argv[]){ 
    //should have an if for argc size 
    char *filename = argv[1]; 
    numeroLinhas(filename); 
} 
+0

. Argv [1] будет иметь символ «\ 0», и вы никогда не будете напрямую обращаться к имени файла, поэтому вам не нужно отслеживать размер или что-то еще. Это должно работать нормально. – JavaHead1560

+3

Ваш комментарий должен быть в ответе, а не в комментарии. Строго, вы должны либо вернуть значение из 'numeroLinhas()', либо изменить его тип возврата на 'void'. –

+0

ах я вижу, я пытался передать имя файла имеет FILE * filename, и вот что я делал неправильно. Спасибо за помощь –

Смежные вопросы