2016-11-04 2 views
0

Я пытаюсь создать программу, которая принимает команды с терминала ubuntu и одновременно считывает их в файл. Команды будут, если пользователь наберет «-c», он будет считывать файл и печатать счетчик символов, если пользователь набирает «-w», он печатает количество слов из прочитанного файла, «-l», чтобы напечатать количество новой строки персонажи. В любом случае я попытался сделать это с помощью fscanf для подсчета символов, но по какой-то причине он не работает. Может ли кто-нибудь объяснить, что я делаю неправильно, или если есть лучшие способы сделать это?С помощью командной строки языка C + Чтение в файле

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


int main(int argc, char *argv[]){ 

int i; 
char words[1000]; 
int counter = 0; 
for(i = 0; i < argc; i++){ 
    if(strncmp(argv[i], "-c", 2) == 0){ 
    if(argv[i + 1] != NULL){ 
     while((fscanf(argv[i + 1], "[^\n]%s", words[i])) != EOF){ 
      counter++; 
     } 
    printf("%d characters\n", counter); 
    } 
    printf("print character count\n"); 
    } 
    else if(strncmp(argv[i], "-w", 2) == 0){ 
    printf("print word counts\n"); 
    } 
    else if(strncmp(argv[i], "-l", 2) == 0){ 
    printf("print newline counts\n"); 
    } 
    else if(strncmp(argv[i], "-h", 2) == 0){ 
    printf("prints help\n"); 
    } 
} 

} 
+0

Это 'sscanf' не' fscanf' для чтения из строки. –

+0

Вы также можете использовать библиотеку getopt для анализа аргументов командной строки. –

ответ

2
  • Первый параметр fscanf является открытым потоком, а не имя файла. Вам нужно передать имя файла fopen, чтобы получить поток.

  • Способ, которым вы пытаетесь использовать fscanf, очень небезопасен, так же, как gets, потому что он может легко переполнить буфер фиксированного размера. fgets, который принимает размер буфера в качестве параметра, будет намного лучше.

  • Ваш формат fscanf неправильный. Когда вы передаете набор символов, значение в скобках следует после % не раньше него, и вы также не используете s. Но эта проблема исчезает бесплатно, когда вы переключаетесь на fgets.

  • fscanf Параметры, которые получают значения, должны быть указателями, но вы передаете один элемент массива. Поскольку fscanf - это varargs, это просто неопределенное поведение. (Некоторые компиляторы имеют специальную обработку кода формата scanf и предупреждают вас о несоответствии типа, но нет общего способа обнаружения несоответствия типа varargs).

  • Чтение до тех пор, пока строка новой строки не будет содержать строки, а не символы. Для чтения одиночных символов используйте fgetc.