Как записать файл в SD-карту, если он вставлен? [Дубликат]

Использование ввода php: // может помочь, но для меня это не сработало, вот что:

  • проверить кодировку данных. Если это URLEncoded, убедитесь, что он отправлен URLEncoded.
  • убедитесь, что кавычки не были экранированы из-за флага волшебных кавычек.

Если эти два проверки не решают вашу проблему, а затем, чтобы узнать, что такое данные, вы должны выполнить эхо или распечатать свои данные до, а затем после декодирования, чтобы узнать, как данные получены и обработаны.

48
задан Josh Matthews 4 September 2008 в 04:08
поделиться

8 ответов

Для простых задач в среде Unix-ish попробуйте popen() .

На странице man:

Функция popen () открывает процесс, создавая канал, разворачивая и вызывая оболочку.

Если вы используете режим чтения, это именно то, о чем вы просили. Я не знаю, реализована ли она в Windows.

Для более сложных проблем вы хотите искать межпроцессное общение.

47
ответ дан dmckee 21 August 2018 в 17:07
поделиться
  • 1
    некоторые примеры правильного использования popen() были бы хороши. – Alexej Magura 29 July 2013 в 20:29
  • 2
    Я добавил ссылку на man-страницу Open Group для этой функции, которая включает пример. В основном popen привязывает вас к указателю файла, очень похожим на fopen. Просто он позволяет вам записываться на стандартный ввод или читать со стандартного вывода программы, а не взаимодействовать с файлом диска. Это философия unix & quot; все является файлом & quot; на работе. Некоторые реализации расширяют стандарт, позволяя двунаправленную связь. – dmckee 30 July 2013 в 02:09
  • 3
    Ответ thi s указывает, что popen доступен в Windows. – Jonathon Reinhart 25 June 2015 в 19:17
  • 4
    Для решения с использованием обработчиков необработанных файлов (если вам нужен асинхронный ввод-вывод, например), см. stackoverflow.com/questions/9405985/… – Ammo Goettsch 3 September 2017 в 15:36

popen поддерживается в Windows, см. здесь:

http://msdn.microsoft.com/en-us/library/96ayss4b.aspx

Если вы хотите, чтобы это была кросс-платформенная, поп-это путь.

9
ответ дан Adam Pierce 21 August 2018 в 17:07
поделиться

Документация MSDN. Если используется в программе Windows, функция _popen возвращает недопустимый указатель файла, который заставляет программу перестать отвечать на неопределенное время. _popen работает правильно в консольном приложении. Чтобы создать приложение Windows, которое перенаправляет ввод и вывод, см. «Создание дочернего процесса с перенаправленными входами и выходами в SDK Windows».

2
ответ дан Angus Connell 21 August 2018 в 17:07
поделиться

В Linux и OS X popen() на самом деле это ваш лучший выбор, как отметил dmckee, поскольку обе ОС поддерживают этот вызов. В Windows это должно помочь: http://msdn.microsoft.com/en-us/library/ms682499.aspx

3
ответ дан Arktronic 21 August 2018 в 17:07
поделиться

Ну, предположим, что вы находитесь в командной строке в среде Windows, вы можете использовать переадресацию труб или команд. Например,

commandThatOutputs.exe > someFileToStoreResults.txt

или

commandThatOutputs.exe | yourProgramToProcessInput.exe

В вашей программе вы могли бы использовать стандартные функции ввода C для чтения других программ (scanf и т. Д.): http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output.asp . Вы также можете использовать пример файла и использовать fscanf. Это также должно работать в Unix / Linux.

Это очень общий вопрос, вы можете включить более подробную информацию, например, какой тип вывода (просто текст или двоичный файл?) И как вы хотите обработать его.

Edit: Hooray clarification!

Перенаправление STDOUT выглядит бесполезным, мне приходилось делать это в .NET, и это давало мне все виды головные боли. Похоже, что правильный способ C - это порождать дочерний процесс, получить указатель на файл, и внезапно у меня болит голова.

Таким образом, это взломать, который использует временные файлы. Это просто, но это должно сработать. Это будет хорошо работать, если скорость не является проблемой (удар по диску медленный) или если он выбрасывается. Если вы строите корпоративную программу, просмотр перенаправления STDOUT, вероятно, лучше всего, используя то, что рекомендовали другие.

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

int main(int argc, char* argv[])
{
    FILE * fptr;                    // file holder
    char c;                         // char buffer


    system("dir >> temp.txt");      // call dir and put it's contents in a temp using redirects.
    fptr = fopen("temp.txt", "r");  // open said file for reading.
                                    // oh, and check for fptr being NULL.
    while(1){
        c = fgetc(fptr);
        if(c!= EOF)
            printf("%c", c);        // do what you need to.
        else
            break;                  // exit when you hit the end of the file.
    }
    fclose(fptr);                   // don't call this is fptr is NULL.  
    remove("temp.txt");             // clean up

    getchar();                      // stop so I can see if it worked.
}

Обязательно проверьте права на доступ к файлам: прямо сейчас это просто выкинет файл в том же каталоге, что и exe. Возможно, вы захотите изучить /tmp в nix или C:\Users\username\Local Settings\Temp в Vista или C:\Documents and Settings\username\Local Settings\Temp in 2K/XP. Я думаю, что /tmp будет работать в OSX, но я никогда не использовал его.

7
ответ дан David J. Sokol 21 August 2018 в 17:07
поделиться
  • 1
    удивительный .. :) это помогло мне .. – Raghu Srikanth Reddy 24 April 2013 в 09:32
  • 2
    c должен быть int, потому что fgetc возвращает int, а не char. – Cool Guy 31 March 2016 в 09:03
//execute external process and read exactly binary or text output
//can read image from Zip file for example
string run(const char* cmd){
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[262144];
    string data;
    string result;
    int dist=0;
    int size;
    //TIME_START
    while(!feof(pipe)) {
        size=(int)fread(buffer,1,262144, pipe); //cout<<buffer<<" size="<<size<<endl;
        data.resize(data.size()+size);
        memcpy(&data[dist],buffer,size);
        dist+=size;
    }
    //TIME_PRINT_
    pclose(pipe);
    return data;
}
-1
ответ дан dharmabook.ru 21 August 2018 в 17:07
поделиться

Вы можете использовать system(), как в:

system("ls song > song.txt");

, где ls - это имя команды для перечисления содержимого песни в папке, а song - это папка в текущем каталоге. Результирующий файл song.txt будет создан в текущем каталоге.

1
ответ дан JB. 21 August 2018 в 17:07
поделиться

Как указывали другие, popen() является наиболее стандартным способом. И поскольку ни один из ответов не предоставил пример с использованием этого метода, вот он:

#include <stdio.h>

#define BUFSIZE 128

int parse_output(void) {
    char *cmd = "ls -l";    

    char buf[BUFSIZE];
    FILE *fp;

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("OUTPUT: %s", buf);
    }

    if(pclose(fp))  {
        printf("Command not found or exited with error status\n");
        return -1;
    }

    return 0;
}
37
ответ дан MestreLion 21 August 2018 в 17:07
поделиться
  • 1
    Должно ли if(pclose(fp)) быть if(pclose(fp) == -1)? – Cool Guy 31 March 2016 в 09:03
  • 2
    @CoolGuy: зависит от того, что вы хотите. pclose() return -1, если произошла ошибка получения статуса выхода команды, в противном случае она возвращает статус выхода. Поскольку команды традиционно устанавливают статус выхода 0 для указания успеха, проверяя if(pclose(fp)), мы тестируем ошибки как в pclose(), так и в команде. – MestreLion 31 March 2016 в 22:48
Другие вопросы по тегам:

Похожие вопросы: